* changed specific bugfix (which was actually wrong implemented, but did the

right thing in most cases nevertheless) to general bugfix
  * fixed bug that caused
    mov (ebp), edx                                    mov (ebp), edx
    mov (edx), edx
This commit is contained in:
Jonas Maebe 1998-11-09 19:33:39 +00:00
parent 20188aa991
commit d8c11fa743
2 changed files with 61 additions and 38 deletions

View File

@ -84,9 +84,11 @@ Begin {CheckSequence}
While (RegCounter <= R_EDI) Do While (RegCounter <= R_EDI) Do
Begin Begin
FillChar(RegInfo, SizeOf(RegInfo), 0); FillChar(RegInfo, SizeOf(RegInfo), 0);
RegInfo.RegsEncountered := [ProcInfo.FramePointer, R_ESP]; RegInfo.NewRegsEncountered := [ProcInfo.FramePointer, R_ESP];
RegInfo.SubstRegs[ProcInfo.FramePointer] := ProcInfo.FramePointer; RegInfo.OldRegsEncountered := RegInfo.NewRegsEncountered;
RegInfo.SubstRegs[R_ESP] := R_ESP; RegInfo.New2OldReg[ProcInfo.FramePointer] := ProcInfo.FramePointer;
RegInfo.New2OldReg[R_ESP] := R_ESP;
RegInfo.Old2NewReg := RegInfo.New2OldReg;
Found := 0; Found := 0;
hp2 := PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod; hp2 := PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod;
If (PrevNonRemovablePai <> PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod) If (PrevNonRemovablePai <> PPaiProp(PrevNonRemovablePai^.fileinfo.line)^.Regs[RegCounter].StartMod)
@ -339,21 +341,21 @@ Begin
If (RegCounter in RegInfo.RegsLoadedForRef) Then If (RegCounter in RegInfo.RegsLoadedForRef) Then
Begin Begin
hp5 := new(pai_asm_comment,init(strpnew('New: '+att_reg2str[RegCounter]+', Old: '+ hp5 := new(pai_asm_comment,init(strpnew('New: '+att_reg2str[RegCounter]+', Old: '+
att_reg2str[RegInfo.SubstRegs[RegCounter]]))); att_reg2str[RegInfo.New2OldReg[RegCounter]])));
InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp5); InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp5);
End; End;
{$EndIf CSDebug} {$EndIf CSDebug}
For RegCounter := R_EAX To R_EDI Do For RegCounter := R_EAX To R_EDI Do
Begin Begin
If (RegInfo.SubstRegs[RegCounter] <> R_NO) Then If (RegInfo.New2OldReg[RegCounter] <> R_NO) Then
If Not(RegCounter In RegInfo.RegsLoadedForRef) And If Not(RegCounter In RegInfo.RegsLoadedForRef) And
{new reg old reg} {old reg new reg}
(RegInfo.SubstRegs[RegCounter] <> RegCounter) Then (RegInfo.New2OldReg[RegCounter] <> RegCounter) Then
Begin Begin
hp3 := New(Pai386,Op_Reg_Reg(A_MOV, S_L, hp3 := New(Pai386,Op_Reg_Reg(A_MOV, S_L,
{old reg new reg} {old reg new reg}
RegInfo.SubstRegs[RegCounter], RegCounter)); RegInfo.New2OldReg[RegCounter], RegCounter));
hp3^.fileinfo := hp2^.fileinfo; hp3^.fileinfo := hp2^.fileinfo;
hp3^.fileinfo.line := PPaiProp(hp2^.fileinfo.line)^.LineSave; hp3^.fileinfo.line := PPaiProp(hp2^.fileinfo.line)^.LineSave;
InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp3); InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp3);
@ -366,7 +368,7 @@ Begin
Begin Begin
{load Cnt2 with the total number of instructions of this sequence} {load Cnt2 with the total number of instructions of this sequence}
Cnt2 := PPaiProp(hp4^.fileinfo.line)^. Cnt2 := PPaiProp(hp4^.fileinfo.line)^.
Regs[RegInfo.SubstRegs[RegCounter]].NrOfMods; Regs[RegInfo.New2OldReg[RegCounter]].NrOfMods;
{sometimes, a register can not be removed from a sequence, because it's {sometimes, a register can not be removed from a sequence, because it's
still used afterwards: still used afterwards:
@ -564,7 +566,14 @@ End.
{ {
$Log$ $Log$
Revision 1.12 1998-10-20 09:32:54 peter Revision 1.13 1998-11-09 19:33:39 jonas
* changed specific bugfix (which was actually wrong implemented, but did the
right thing in most cases nevertheless) to general bugfix
* fixed bug that caused
mov (ebp), edx mov (ebp), edx
mov (edx), edx
Revision 1.12 1998/10/20 09:32:54 peter
* removed some unused vars * removed some unused vars
Revision 1.11 1998/10/07 16:24:52 jonas Revision 1.11 1998/10/07 16:24:52 jonas

View File

@ -42,9 +42,9 @@ Type
TRegArray = Array[R_EAX..R_BL] of TRegister; TRegArray = Array[R_EAX..R_BL] of TRegister;
TRegSet = Set of R_EAX..R_BL; TRegSet = Set of R_EAX..R_BL;
TRegInfo = Record TRegInfo = Record
RegsEncountered: TRegSet; NewRegsEncountered, OldRegsEncountered: TRegSet;
RegsLoadedForRef: TRegSet; RegsLoadedForRef: TRegSet;
SubstRegs: TRegArray; Old2NewReg, New2OldReg: TRegArray;
End; End;
{*********************** Procedures and Functions ************************} {*********************** Procedures and Functions ************************}
@ -824,43 +824,55 @@ Begin
End; End;
Procedure AddReg2RegInfo(OldReg, NewReg: TRegister; Var RegInfo: TRegInfo); Procedure AddReg2RegInfo(OldReg, NewReg: TRegister; Var RegInfo: TRegInfo);
{updates the RegsEncountered and SubstRegs fields of RegInfo. Assumes that {updates the ???RegsEncountered and ???2???Reg fields of RegInfo. Assumes that
OldReg and NewReg have the same size (has to be chcked in advance with OldReg and NewReg have the same size (has to be chcked in advance with
RegsSameSize) and that neither equals R_NO} RegsSameSize) and that neither equals R_NO}
Begin Begin
With RegInfo Do With RegInfo Do
Begin Begin
RegsEncountered := RegsEncountered + [NewReg]; NewRegsEncountered := NewRegsEncountered + [NewReg];
SubstRegs[NewReg] := OldReg; OldRegsEncountered := OldRegsEncountered + [OldReg];
New2OldReg[NewReg] := OldReg;
Old2NewReg[OldReg] := NewReg;
Case OldReg Of Case OldReg Of
R_EAX..R_EDI: R_EAX..R_EDI:
Begin Begin
RegsEncountered := RegsEncountered + [Reg32toReg16(NewReg)]; NewRegsEncountered := NewRegsEncountered + [Reg32toReg16(NewReg)];
SubstRegs[Reg32toReg16(NewReg)] := Reg32toReg16(OldReg); OldRegsEncountered := OldRegsEncountered + [Reg32toReg16(OldReg)];
New2OldReg[Reg32toReg16(NewReg)] := Reg32toReg16(OldReg);
Old2NewReg[Reg32toReg16(OldReg)] := Reg32toReg16(NewReg);
If (NewReg in [R_EAX..R_EBX]) And If (NewReg in [R_EAX..R_EBX]) And
(OldReg in [R_EAX..R_EBX]) Then (OldReg in [R_EAX..R_EBX]) Then
Begin Begin
RegsEncountered := RegsEncountered + [Reg32toReg8(NewReg)]; NewRegsEncountered := NewRegsEncountered + [Reg32toReg8(NewReg)];
SubstRegs[Reg32toReg8(NewReg)] := Reg32toReg8(OldReg); OldRegsEncountered := OldRegsEncountered + [Reg32toReg8(OldReg)];
New2OldReg[Reg32toReg8(NewReg)] := Reg32toReg8(OldReg);
Old2NewReg[Reg32toReg8(OldReg)] := Reg32toReg8(NewReg);
End; End;
End; End;
R_AX..R_DI: R_AX..R_DI:
Begin Begin
RegsEncountered := RegsEncountered + [Reg16toReg32(NewReg)]; NewRegsEncountered := NewRegsEncountered + [Reg16toReg32(NewReg)];
SubstRegs[Reg16toReg32(NewReg)] := Reg16toReg32(OldReg); OldRegsEncountered := OldRegsEncountered + [Reg16toReg32(OldReg)];
New2OldReg[Reg16toReg32(NewReg)] := Reg16toReg32(OldReg);
Old2NewReg[Reg16toReg32(OldReg)] := Reg16toReg32(NewReg);
If (NewReg in [R_AX..R_BX]) And If (NewReg in [R_AX..R_BX]) And
(OldReg in [R_AX..R_BX]) Then (OldReg in [R_AX..R_BX]) Then
Begin Begin
RegsEncountered := RegsEncountered + [Reg16toReg8(NewReg)]; NewRegsEncountered := NewRegsEncountered + [Reg16toReg8(NewReg)];
SubstRegs[Reg16toReg8(NewReg)] := Reg16toReg8(OldReg); OldRegsEncountered := OldRegsEncountered + [Reg16toReg8(OldReg)];
New2OldReg[Reg16toReg8(NewReg)] := Reg16toReg8(OldReg);
Old2NewReg[Reg16toReg8(OldReg)] := Reg16toReg8(NewReg);
End; End;
End; End;
R_AL..R_BL: R_AL..R_BL:
Begin Begin
RegsEncountered := RegsEncountered + [Reg8toReg32(NewReg)] NewRegsEncountered := NewRegsEncountered + [Reg8toReg32(NewReg)]
+ [Reg8toReg16(NewReg)]; + [Reg8toReg16(NewReg)];
SubstRegs[Reg8toReg32(NewReg)] := Reg8toReg32(OldReg); OldRegsEncountered := OldRegsEncountered + [Reg8toReg32(OldReg)]
SubstRegs[Reg8toReg16(NewReg)] := Reg8toReg16(OldReg); + [Reg8toReg16(OldReg)];
New2OldReg[Reg8toReg32(NewReg)] := Reg8toReg32(OldReg);
Old2NewReg[Reg8toReg16(OldReg)] := Reg8toReg16(NewReg);
End; End;
End; End;
End; End;
@ -893,12 +905,16 @@ Begin
processed. This happens if it has been compared with a register that doesn't processed. This happens if it has been compared with a register that doesn't
have an 8 bit component (such as EDI). In that case the 8 bit component is have an 8 bit component (such as EDI). In that case the 8 bit component is
still set to R_NO and the comparison in the Else-part will fail} still set to R_NO and the comparison in the Else-part will fail}
If Not(Reg32(NewReg) in RegsEncountered) Then If Not((Reg32(NewReg) in NewRegsEncountered) Or
(Reg32(OldReg) in OldRegsEncountered)) Then
Begin Begin
AddReg2RegInfo(OldReg, NewReg, RegInfo); AddReg2RegInfo(OldReg, NewReg, RegInfo);
RegsEquivalent := True RegsEquivalent := True
End End
Else RegsEquivalent := OldReg = SubstRegs[NewReg] Else RegsEquivalent :=
(Reg32(NewReg) in NewRegsEncountered) And
(Reg32(OldReg) in OldRegsEncountered) And
(OldReg = New2OldReg[NewReg])
Else RegsEquivalent := False Else RegsEquivalent := False
Else RegsEquivalent := OldReg = NewReg Else RegsEquivalent := OldReg = NewReg
End; End;
@ -1355,18 +1371,9 @@ Begin {checks whether two Pai386 instructions are equal}
Writeln(att_reg2str[Reg32(TRegister(Pai386(p2)^.op2))], ' removed'); Writeln(att_reg2str[Reg32(TRegister(Pai386(p2)^.op2))], ' removed');
end; end;
{$endif csdebug} {$endif csdebug}
If (TRegister(Pai386(p1)^.op2) In RegInfo.RegsEncountered) Or
Not(RegInRef(TRegister(Pai386(p1)^.op2), TReference(Pai386(p2)^.op1^))) Then
{ To avoid
movl 48(%esi), %esi movl 48(%esi), %esi
pushl %esi getting changed to pushl %esi
movl 48(%esi), %edi movl %esi, %edi }
InstructionsEquivalent := InstructionsEquivalent :=
OpsEquivalent(Pai386(p1)^.op1t, Pai386(p1)^.op1, Pai386(p2)^.op1, RegInfo) And OpsEquivalent(Pai386(p1)^.op1t, Pai386(p1)^.op1, Pai386(p2)^.op1, RegInfo) And
OpsEquivalent(Pai386(p1)^.op2t, Pai386(p1)^.op2, Pai386(p2)^.op2, RegInfo) OpsEquivalent(Pai386(p1)^.op2t, Pai386(p1)^.op2, Pai386(p2)^.op2, RegInfo)
Else InstructionsEquivalent := False
End End
Else Else
{an instruction <> mov, movzx, movsx} {an instruction <> mov, movzx, movsx}
@ -2000,7 +2007,14 @@ End.
{ {
$Log$ $Log$
Revision 1.21 1998-11-02 23:17:49 jonas Revision 1.22 1998-11-09 19:33:40 jonas
* changed specific bugfix (which was actually wrong implemented, but did the
right thing in most cases nevertheless) to general bugfix
* fixed bug that caused
mov (ebp), edx mov (ebp), edx
mov (edx), edx
Revision 1.21 1998/11/02 23:17:49 jonas
* fixed bug shown in sortbug program from fpc-devel list * fixed bug shown in sortbug program from fpc-devel list
Revision 1.20 1998/10/22 13:24:51 jonas Revision 1.20 1998/10/22 13:24:51 jonas