+ removal of superflouos cld/std instructions

This commit is contained in:
Jonas Maebe 1998-04-06 22:42:32 +00:00
parent d6e74e2082
commit 8a527432e7

View File

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