mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 18:29:18 +02:00
+ removal of superflouos cld/std instructions
This commit is contained in:
parent
d6e74e2082
commit
8a527432e7
@ -27,6 +27,7 @@
|
|||||||
Type TwoWords = Record
|
Type TwoWords = Record
|
||||||
Word1, Word2: Word
|
Word1, Word2: Word
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function Reg32(Reg: TRegister): TRegister;
|
Function Reg32(Reg: TRegister): TRegister;
|
||||||
{Returns the 32 bit component of Reg if it exists, otherwise Reg is returned}
|
{Returns the 32 bit component of Reg if it exists, otherwise Reg is returned}
|
||||||
Begin
|
Begin
|
||||||
@ -88,14 +89,12 @@ Const MaxCh = 3;
|
|||||||
|
|
||||||
Type TChange = (C_None,
|
Type TChange = (C_None,
|
||||||
C_EAX, C_ECX, C_EDX, C_EBX, C_ESP, C_EBP, C_ESI, C_EDI,
|
C_EAX, C_ECX, C_EDX, C_EBX, C_ESP, C_EBP, C_ESI, C_EDI,
|
||||||
{ C_AX, C_CX, C_DX, C_BX, C_SP, C_BP, C_SI, C_DI,
|
C_CDirFlag, C_SDirFlag, C_Flags, C_FPU,
|
||||||
C_AL, C_CL, C_DL, C_BL,
|
|
||||||
C_AH, C_CH, C_BH, C_DH,
|
|
||||||
C_DEFAULT_SEG, C_CS, C_DS, C_ES, C_FS, C_GS, C_SS,
|
|
||||||
} C_Flags, C_FPU,
|
|
||||||
C_Op1, C_Op2, C_Op3,
|
C_Op1, C_Op2, C_Op3,
|
||||||
C_MemEDI);
|
C_MemEDI);
|
||||||
|
|
||||||
|
TFlagContents = (F_Unknown, F_NotSet, F_Set);
|
||||||
|
|
||||||
TAsmInstrucProp = Record
|
TAsmInstrucProp = Record
|
||||||
NCh: Byte;
|
NCh: Byte;
|
||||||
Ch: Array[1..MaxCh] of TChange;
|
Ch: Array[1..MaxCh] of TChange;
|
||||||
@ -103,8 +102,8 @@ Type TChange = (C_None,
|
|||||||
|
|
||||||
TContent = Record
|
TContent = Record
|
||||||
StartMod: Pointer; {start and end of block instructions that defines the
|
StartMod: Pointer; {start and end of block instructions that defines the
|
||||||
content of this register; If Typ = con_const, then
|
content of this register; If Typ = con_const, then
|
||||||
Longint(StartMod) = value of the constant)}
|
Longint(StartMod) = value of the constant)}
|
||||||
State: Word; {starts at 0, gets increased everytime the register is modified}
|
State: Word; {starts at 0, gets increased everytime the register is modified}
|
||||||
NrOfMods: Byte;
|
NrOfMods: Byte;
|
||||||
{ ModReg: TRegister; }{if one register gets a block assigned from an other register,
|
{ ModReg: TRegister; }{if one register gets a block assigned from an other register,
|
||||||
@ -121,6 +120,7 @@ Type TChange = (C_None,
|
|||||||
Regs: TRegContent;
|
Regs: TRegContent;
|
||||||
{ FPURegs: TRegFPUContent;} {currently not yet used}
|
{ FPURegs: TRegFPUContent;} {currently not yet used}
|
||||||
LineSave: Longint;
|
LineSave: Longint;
|
||||||
|
DirFlag: TFlagContents;
|
||||||
{can this instruction be removed?}
|
{can this instruction be removed?}
|
||||||
CanBeRemoved: Boolean;
|
CanBeRemoved: Boolean;
|
||||||
End;
|
End;
|
||||||
@ -190,7 +190,7 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
|
|||||||
{NONE} (NCh: 0; Ch: (C_None, C_None, C_None)),
|
{NONE} (NCh: 0; Ch: (C_None, C_None, C_None)),
|
||||||
{ENTER} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
{ENTER} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
||||||
{LEAVE} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
{LEAVE} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
||||||
{CLD} (NCh: 1; Ch: (C_Flags, C_None, C_None)),
|
{CLD} (NCh: 1; Ch: (C_CDirFlag, C_None, C_None)),
|
||||||
{MOVS} (NCh: 3; Ch: (C_ESI, C_EDI, C_MemEDI)),
|
{MOVS} (NCh: 3; Ch: (C_ESI, C_EDI, C_MemEDI)),
|
||||||
{REP} (NCh: 1; Ch: (C_ECX, C_None, C_None)),
|
{REP} (NCh: 1; Ch: (C_ECX, C_None, C_None)),
|
||||||
{SHL} (NCh: 2; Ch: (C_Op2, C_Flags, C_None)),
|
{SHL} (NCh: 2; Ch: (C_Op2, C_Flags, C_None)),
|
||||||
@ -249,7 +249,7 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
|
|||||||
{PUSHF} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
{PUSHF} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
||||||
{PUSHFD} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
{PUSHFD} (NCh: 1; Ch: (C_ESP, C_None, C_None)),
|
||||||
{STC} (NCh: 1; Ch: (C_Flags, C_None, C_None)),
|
{STC} (NCh: 1; Ch: (C_Flags, C_None, C_None)),
|
||||||
{STD} (NCh: 1; Ch: (C_Flags, C_None, C_None)),
|
{STD} (NCh: 1; Ch: (C_SDirFlag, C_None, C_None)),
|
||||||
{STI} (NCh: 1; Ch: (C_Flags, C_None, C_None)),
|
{STI} (NCh: 1; Ch: (C_Flags, C_None, C_None)),
|
||||||
{STOS} (NCh: 2; Ch: (C_MemEDI, C_EDI, C_None)),
|
{STOS} (NCh: 2; Ch: (C_MemEDI, C_EDI, C_None)),
|
||||||
{WAIT} (NCh: 0; Ch: (C_None, C_None, C_None)),
|
{WAIT} (NCh: 0; Ch: (C_None, C_None, C_None)),
|
||||||
@ -470,52 +470,52 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
|
|||||||
{POPFD} (NCh: 2; Ch: (C_ESP, C_Flags, C_None)),
|
{POPFD} (NCh: 2; Ch: (C_ESP, C_Flags, C_None)),
|
||||||
{below are the MMX instructions}
|
{below are the MMX instructions}
|
||||||
{A_EMMS} (NCh: 1; Ch: (C_FPU, C_None, C_None)),
|
{A_EMMS} (NCh: 1; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_MOVD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_MOVD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_MOVQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_MOVQ} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PACKSSDW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PACKSSDW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PACKSSWB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PACKSSWB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PACKUSWB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PACKUSWB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PADDB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDB} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PADDD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PADDSB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDSB} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PADDSW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDSW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PADDUSB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDUSB} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PADDUSW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDUSW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PADDW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PADDW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PAND} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PAND} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PANDN} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PANDN} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PCMPEQB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PCMPEQB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PCMPEQD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PCMPEQD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PCMPEQW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PCMPEQW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PCMPGTB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PCMPGTB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PCMPGTD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PCMPGTD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PCMPGTW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PCMPGTW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PMADDWD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PMADDWD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PMULHW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PMULHW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PMULLW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PMULLW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_POR} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_POR} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSLLD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSLLD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSLLQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSLLQ} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSLLW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSLLW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSRAD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSRAD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSRAW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSRAW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSRLD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSRLD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSRLQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSRLQ} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSRLW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSRLW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBB} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBD} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBSB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBSB} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBSW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBSW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBUSB} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBUSB} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBUSW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBUSW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PSUBW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PSUBW} (NCh: 1; Ch: (C_Op2, C_None, C_None)),
|
||||||
{A_PUNPCKHBW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PUNPCKHBW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PUNPCKHDQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PUNPCKHDQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PUNPCKHWD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PUNPCKHWD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PUNPCKLBW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PUNPCKLBW} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PUNPCKLDQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PUNPCKLDQ} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PUNPCKLWD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
{A_PUNPCKLWD} (NCh: 255; Ch: (C_FPU, C_None, C_None)),
|
||||||
{A_PXOR} (NCh: 255; Ch: (C_FPU, C_None, C_None)));
|
{A_PXOR} (NCh: 1; Ch: (C_Op2, C_None, C_None)));
|
||||||
|
|
||||||
Var NrOfPaiObjs, NrOfPaiFast: Longint;
|
Var NrOfPaiObjs, NrOfPaiFast: Longint;
|
||||||
PaiPropBlock: PPaiPropBlock;
|
PaiPropBlock: PPaiPropBlock;
|
||||||
@ -778,6 +778,7 @@ Var Counter: TRegister;
|
|||||||
Begin {initializes/desrtoys all registers}
|
Begin {initializes/desrtoys all registers}
|
||||||
For Counter := R_EAX To R_EDI Do
|
For Counter := R_EAX To R_EDI Do
|
||||||
DestroyReg(p, Counter);
|
DestroyReg(p, Counter);
|
||||||
|
PPaiProp(p^.line)^.DirFlag := F_Unknown;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure Destroy(PaiObj: Pai; opt: Longint; Op: Pointer);
|
Procedure Destroy(PaiObj: Pai; opt: Longint; Op: Pointer);
|
||||||
@ -933,6 +934,9 @@ Begin
|
|||||||
For Cnt := 1 To InstrProp.NCh Do
|
For Cnt := 1 To InstrProp.NCh Do
|
||||||
Case InstrProp.Ch[Cnt] Of
|
Case InstrProp.Ch[Cnt] Of
|
||||||
C_None:;
|
C_None:;
|
||||||
|
C_EAX..C_EDI: DestroyReg(p, TCh2Reg(InstrProp.Ch[Cnt]));
|
||||||
|
C_CDirFlag: PPaiProp(Pai(p)^.line)^.DirFlag := F_NotSet;
|
||||||
|
C_SDirFlag: PPaiProp(Pai(p)^.line)^.DirFlag := F_Set;
|
||||||
C_Op1: Destroy(p, Pai386(p)^.op1t, Pai386(p)^.op1);
|
C_Op1: Destroy(p, Pai386(p)^.op1t, Pai386(p)^.op1);
|
||||||
C_Op2: Destroy(p, Pai386(p)^.op2t, Pai386(p)^.op2);
|
C_Op2: Destroy(p, Pai386(p)^.op2t, Pai386(p)^.op2);
|
||||||
C_Op3: Destroy(p, Pai386(p)^.op2t, Pointer(Longint(TwoWords(Pai386(p)^.op2).word2)));
|
C_Op3: Destroy(p, Pai386(p)^.op2t, Pointer(Longint(TwoWords(Pai386(p)^.op2).word2)));
|
||||||
@ -942,7 +946,6 @@ Begin
|
|||||||
TmpRef.Base := R_EDI;
|
TmpRef.Base := R_EDI;
|
||||||
DestroyRefs(p, TmpRef, R_NO)
|
DestroyRefs(p, TmpRef, R_NO)
|
||||||
End;
|
End;
|
||||||
C_EAX..C_EDI: DestroyReg(p, TCh2Reg(InstrProp.Ch[Cnt]));
|
|
||||||
C_Flags, C_FPU:;
|
C_Flags, C_FPU:;
|
||||||
End
|
End
|
||||||
Else
|
Else
|
||||||
@ -977,6 +980,9 @@ Begin
|
|||||||
ait_instruction:
|
ait_instruction:
|
||||||
Begin
|
Begin
|
||||||
Case Pai386(p)^._operator Of
|
Case Pai386(p)^._operator Of
|
||||||
|
A_CLD: If Assigned(p^.last) And
|
||||||
|
(PPaiProp(Pai(p^.last)^.line)^.DirFlag = F_NotSet) Then
|
||||||
|
PPaiProp(Pai(p)^.line)^.CanBeRemoved := True;
|
||||||
{$IfDef OptimizeMovs}
|
{$IfDef OptimizeMovs}
|
||||||
A_MOV{, A_MOVZX, A_MOVSX}:
|
A_MOV{, A_MOVZX, A_MOVSX}:
|
||||||
Begin
|
Begin
|
||||||
@ -1060,6 +1066,9 @@ Begin
|
|||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
{$EndIf OptimizeMovs}
|
{$EndIf OptimizeMovs}
|
||||||
|
A_STD: If Assigned(p^.last) And
|
||||||
|
(PPaiProp(Pai(p^.last)^.line)^.DirFlag = F_Set) Then
|
||||||
|
PPaiProp(Pai(p)^.line)^.CanBeRemoved := True;
|
||||||
A_XOR:
|
A_XOR:
|
||||||
Begin
|
Begin
|
||||||
If (Pai386(p)^.op1t = top_reg) And
|
If (Pai386(p)^.op1t = top_reg) And
|
||||||
@ -1169,8 +1178,11 @@ End;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1998-03-25 11:18:12 root
|
Revision 1.2 1998-04-06 22:42:32 jonas
|
||||||
Initial revision
|
+ removal of superflouos cld/std instructions
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1998/03/25 11:18:12 root
|
||||||
|
* Restored version
|
||||||
|
|
||||||
Revision 1.22 1998/03/24 21:48:29 florian
|
Revision 1.22 1998/03/24 21:48:29 florian
|
||||||
* just a couple of fixes applied:
|
* just a couple of fixes applied:
|
||||||
|
Loading…
Reference in New Issue
Block a user