* changed state to WState (WriteState), added RState for future use in

instruction scheduling
  * RegAlloc data from the CG is now completely being patched and corrected (I
     think)
This commit is contained in:
Jonas Maebe 1998-10-07 16:27:02 +00:00
parent de7086cc3c
commit ebd27df235

View File

@ -1,6 +1,6 @@
{
$Id$
Copyright (c) 1997-98 by Jonas Maebe
Copyright (c) 1997-98 by the Free Pascal Development Team
This unit contains the data flow analyzer and several helper procedures
and functions.
@ -110,7 +110,7 @@ Type
{read and write from/to a register}
C_RWEAX, C_RWECX, C_RWEDX, C_RWEBX, C_RWESP, C_RWEBP, C_RWESI, C_RWEDI,
C_CDirFlag {clear direction flag}, C_SDirFlag {set dir flag},
C_Flags, C_FPU,
C_RFlags, C_WFlags, C_RWFlags, C_FPU,
C_ROp1, C_WOp1, C_RWOp1,
C_ROp2, C_WOp2, C_RWOp2,
C_ROp3, C_WOp3, C_RWOp3,
@ -132,8 +132,10 @@ Type
content of this register. If Typ = con_const, then
Longint(StartMod) = value of the constant)}
StartMod: Pointer;
{starts at 1, gets increased everytime the register is modified}
State: Word;
{starts at 0, gets increased everytime the register is modified}
WState: Byte;
{starts at 0, gets increased everytime the register is read from}
RState: Byte;
{how many instructions starting with StarMod does the block consist of}
NrOfMods: Byte;
{if one register gets a block assigned from an other register,
@ -166,22 +168,21 @@ Type
End;
PPaiProp = ^TPaiProp;
{$IfDef TP}
TPaiPropBlock = Array[1..(65520 div (((SizeOf(TPaiProp)+1)div 2)*2))] Of TPaiProp;
{$else}
{$IfNDef TP}
TPaiPropBlock = Array[1..250000] Of TPaiProp;
{$EndIf TP}
PPaiPropBlock = ^TPaiPropBlock;
{$EndIf TP}
TInstrSinceLastMod = Array[R_EAX..R_EDI] Of Byte;
TLabelTableItem = Record
PaiObj: Pai;
{$IfNDef TP}
{$IfDef JumpAnal}
InstrNr: Longint;
RefsFound: Word;
JmpsProcessed: Word
{$EndIf TP}
{$EndIf JumpAnal}
End;
{$IfDef tp}
TLabelTable = Array[0..10000] Of TLabelTableItem;
@ -198,8 +199,11 @@ Type
Var
{the amount of PaiObjects in the current assembler list}
NrOfPaiObjs: Longint;
{Array which holds all (FPC) or as much as possible (TP) PPaiProps}
{$IfNDef TP}
{Array which holds all TPaiProps}
PaiPropBlock: PPaiPropBlock;
{$EndIf TP}
LoLab, HiLab, LabDif: Longint;
@ -216,45 +220,45 @@ Uses globals, systems, strings, verbose, hcodegen,
{$endif i386}
Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
{MOV} (Ch: (C_WOp2, C_None, C_None)),
{MOVZX} (Ch: (C_WOp2, C_None, C_None)),
{MOVSX} (Ch: (C_WOp2, C_None, C_None)),
{MOV} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVZX} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVSX} (Ch: (C_WOp2, C_ROp1, C_None)),
{LABEL} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{ADD} (Ch: (C_RWOp2, C_Flags, C_None)),
{ADD} (Ch: (C_RWOp2, C_ROp1, C_WFlags)),
{CALL} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{IDIV} (Ch: (C_RWEAX, C_WEDX, C_Flags)),
{IMUL} (Ch: (C_WEAX, C_WEDX, C_Flags)), {handled separately, because several forms exist}
{IDIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)),
{IMUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)), {handled separately, because several forms exist}
{JMP} (Ch: (C_None, C_None, C_None)),
{LEA} (Ch: (C_WOp2, C_None, C_None)),
{MUL} (Ch: (C_RWEAX, C_WEDX, C_Flags)),
{NEG} (Ch: (C_WOp1, C_None, C_None)),
{NOT} (Ch: (C_WOp1, C_Flags, C_None)),
{LEA} (Ch: (C_WOp2, C_ROp1, C_None)),
{MUL} (Ch: (C_RWEAX, C_WEDX, C_WFlags)),
{NEG} (Ch: (C_RWOp1, C_None, C_None)),
{NOT} (Ch: (C_RWOp1, C_WFlags, C_None)),
{POP} (Ch: (C_WOp1, C_RWESP, C_None)),
{POPAD} (Ch: (C_None, C_None, C_None)), {don't know value of any register}
{POPAD} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{PUSH} (Ch: (C_RWESP, C_None, C_None)),
{PUSHAD} (Ch: (C_RWESP, C_None, C_None)),
{RET} (Ch: (C_None, C_None, C_None)), {don't know value of any register}
{SUB} (Ch: (C_RWOp2, C_Flags, C_None)),
{RET} (Ch: (C_None, C_None, C_None)),
{SUB} (Ch: (C_RWOp2, C_ROp1, C_WFlags)),
{XCHG} (Ch: (C_RWOp1, C_RWOp2, C_None)), {(will be) handled seperately}
{XOR} (Ch: (C_RWOp2, C_Flags, C_None)),
{XOR} (Ch: (C_RWOp2, C_ROp1, C_WFlags)),
{FILD} (Ch: (C_FPU, C_None, C_None)),
{CMP} (Ch: (C_Flags, C_None, C_None)),
{CMP} (Ch: (C_RFlags, C_None, C_None)),
{JZ} (Ch: (C_None, C_None, C_None)),
{INC} (Ch: (C_RWOp1, C_Flags, C_None)),
{DEC} (Ch: (C_RWOp1, C_Flags, C_None)),
{SETE} (Ch: (C_WOp1, C_None, C_None)),
{SETNE} (Ch: (C_WOp1, C_None, C_None)),
{SETL} (Ch: (C_WOp1, C_None, C_None)),
{SETG} (Ch: (C_WOp1, C_None, C_None)),
{SETLE} (Ch: (C_WOp1, C_None, C_None)),
{SETGE} (Ch: (C_WOp1, C_None, C_None)),
{JE} (Ch: (C_None, C_None, C_None)),
{JNE} (Ch: (C_None, C_None, C_None)),
{JL} (Ch: (C_None, C_None, C_None)),
{JG} (Ch: (C_None, C_None, C_None)),
{JLE} (Ch: (C_None, C_None, C_None)),
{JGE} (Ch: (C_None, C_None, C_None)),
{OR} (Ch: (C_RWOp2, C_Flags, C_None)),
{INC} (Ch: (C_RWOp1, C_RFlags, C_None)),
{DEC} (Ch: (C_RWOp1, C_WFlags, C_None)),
{SETE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETL} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETG} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETLE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETGE} (Ch: (C_WOp1, C_RFlags, C_None)),
{JE} (Ch: (C_RFlags, C_None, C_None)),
{JNE} (Ch: (C_RFlags, C_None, C_None)),
{JL} (Ch: (C_RFlags, C_None, C_None)),
{JG} (Ch: (C_RFlags, C_None, C_None)),
{JLE} (Ch: (C_RFlags, C_None, C_None)),
{JGE} (Ch: (C_RFlags, C_None, C_None)),
{OR} (Ch: (C_RWOp2, C_WFlags, C_None)),
{FLD} (Ch: (C_FPU, C_None, C_None)),
{FADD} (Ch: (C_FPU, C_None, C_None)),
{FMUL} (Ch: (C_FPU, C_None, C_None)),
@ -263,26 +267,26 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
{FCHS} (Ch: (C_FPU, C_None, C_None)),
{FLD1} (Ch: (C_FPU, C_None, C_None)),
{FIDIV} (Ch: (C_FPU, C_None, C_None)),
{CLTD} (Ch: (C_WEDX, C_None, C_None)),
{JNZ} (Ch: (C_None, C_None, C_None)),
{CLTD} (Ch: (C_WEDX, C_REAX, C_None)),
{JNZ} (Ch: (C_RFlags, C_None, C_None)),
{FSTP} (Ch: (C_WOp1, C_None, C_None)),
{AND} (Ch: (C_RWOp2, C_Flags, C_None)),
{JNO} (Ch: (C_None, C_None, C_None)),
{AND} (Ch: (C_RWOp2, C_WFlags, C_None)),
{JNO} (Ch: (C_RFlags, C_None, C_None)),
{NOTH} (Ch: (C_None, C_None, C_None)), {***???***}
{NONE} (Ch: (C_None, C_None, C_None)),
{ENTER} (Ch: (C_RWESP, C_None, C_None)),
{LEAVE} (Ch: (C_RWESP, C_None, C_None)),
{CLD} (Ch: (C_CDirFlag, C_None, C_None)),
{MOVS} (Ch: (C_RWESI, C_RWEDI, C_MemEDI)),
{REP} (Ch: (C_RWECX, C_None, C_None)),
{SHL} (Ch: (C_RWOp2, C_Flags, C_None)),
{SHR} (Ch: (C_RWOp2, C_Flags, C_None)),
{BOUND} (Ch: (C_None, C_None, C_None)),
{JNS} (Ch: (C_None, C_None, C_None)),
{JS} (Ch: (C_None, C_None, C_None)),
{JO} (Ch: (C_None, C_None, C_None)),
{SAR} (Ch: (C_RWOp2, C_Flags, C_None)),
{TEST} (Ch: (C_Flags, C_None, C_None)),
{REP} (Ch: (C_RWECX, C_RFlags, C_None)),
{SHL} (Ch: (C_RWOp2, C_WFlags, C_None)),
{SHR} (Ch: (C_RWOp2, C_WFlags, C_None)),
{BOUND} (Ch: (C_ROp1, C_None, C_None)),
{JNS} (Ch: (C_RFlags, C_None, C_None)),
{JS} (Ch: (C_RFlags, C_None, C_None)),
{JO} (Ch: (C_RFlags, C_None, C_None)),
{SAR} (Ch: (C_RWOp2, C_WFlags, C_None)),
{TEST} (Ch: (C_WFlags, C_ROp1, C_ROp2)),
{FCOM} (Ch: (C_FPU, C_None, C_None)),
{FCOMP} (Ch: (C_FPU, C_None, C_None)),
{FCOMPP} (Ch: (C_FPU, C_None, C_None)),
@ -292,31 +296,31 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
{FSUBP} (Ch: (C_FPU, C_None, C_None)),
{FDIVP} (Ch: (C_FPU, C_None, C_None)),
{FNSTS} (Ch: (C_WOp1, C_None, C_None)),
{SAHF} (Ch: (C_Flags, C_None, C_None)),
{SAHF} (Ch: (C_WFlags, C_REAX, C_None)),
{FDIVRP} (Ch: (C_FPU, C_None, C_None)),
{FSUBRP} (Ch: (C_FPU, C_None, C_None)),
{SETC} (Ch: (C_WOp1, C_None, C_None)),
{SETNC} (Ch: (C_WOp1, C_None, C_None)),
{JC} (Ch: (C_None, C_None, C_None)),
{JNC} (Ch: (C_None, C_None, C_None)),
{JA} (Ch: (C_None, C_None, C_None)),
{JAE} (Ch: (C_None, C_None, C_None)),
{JB} (Ch: (C_None, C_None, C_None)),
{JBE} (Ch: (C_None, C_None, C_None)),
{SETA} (Ch: (C_WOp1, C_None, C_None)),
{SETAE} (Ch: (C_WOp1, C_None, C_None)),
{SETB} (Ch: (C_WOp1, C_None, C_None)),
{SETBE} (Ch: (C_WOp1, C_None, C_None)),
{AAA} (Ch: (C_RWEAX, C_Flags, C_None)),
{AAD} (Ch: (C_RWEAX, C_Flags, C_None)),
{AAM} (Ch: (C_RWEAX, C_Flags, C_None)),
{AAS} (Ch: (C_RWEAX, C_Flags, C_None)),
{SETC} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNC} (Ch: (C_WOp1, C_RFlags, C_None)),
{JC} (Ch: (C_None, C_RFlags, C_None)),
{JNC} (Ch: (C_None, C_RFlags, C_None)),
{JA} (Ch: (C_None, C_RFlags, C_None)),
{JAE} (Ch: (C_None, C_RFlags, C_None)),
{JB} (Ch: (C_None, C_RFlags, C_None)),
{JBE} (Ch: (C_None, C_RFlags, C_None)),
{SETA} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETAE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETB} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETBE} (Ch: (C_WOp1, C_RFlags, C_None)),
{AAA} (Ch: (C_RWEAX, C_WFlags, C_None)),
{AAD} (Ch: (C_RWEAX, C_WFlags, C_None)),
{AAM} (Ch: (C_RWEAX, C_WFlags, C_None)),
{AAS} (Ch: (C_RWEAX, C_WFlags, C_None)),
{CBW} (Ch: (C_RWEAX, C_None, C_None)),
{CDQ} (Ch: (C_RWEAX, C_WEDX, C_None)),
{CLC} (Ch: (C_Flags, C_None, C_None)),
{CLI} (Ch: (C_Flags, C_None, C_None)),
{CLC} (Ch: (C_WFlags, C_None, C_None)),
{CLI} (Ch: (C_WFlags, C_None, C_None)),
{CLTS} (Ch: (C_None, C_None, C_None)),
{CMC} (Ch: (C_Flags, C_None, C_None)),
{CMC} (Ch: (C_WFlags, C_None, C_None)),
{CWD} (Ch: (C_RWEAX, C_WEDX, C_None)),
{CWDE} (Ch: (C_RWEAX, C_None, C_None)),
{DAA} (Ch: (C_RWEAX, C_None, C_None)),
@ -330,109 +334,109 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
{PUSHA} (Ch: (C_RWESP, C_None, C_None)),
{PUSHF} (Ch: (C_RWESP, C_None, C_None)),
{PUSHFD} (Ch: (C_RWESP, C_None, C_None)),
{STC} (Ch: (C_Flags, C_None, C_None)),
{STC} (Ch: (C_WFlags, C_None, C_None)),
{STD} (Ch: (C_SDirFlag, C_None, C_None)),
{STI} (Ch: (C_Flags, C_None, C_None)),
{STI} (Ch: (C_WFlags, C_None, C_None)),
{STOS} (Ch: (C_MemEDI, C_RWEDI, C_None)),
{WAIT} (Ch: (C_None, C_None, C_None)),
{XLAT} (Ch: (C_WEAX, C_None, C_None)),
{XLATB} (Ch: (C_WEAX, C_None, C_None)),
{MOVSB} (Ch: (C_WOp2, C_None, C_None)),
{MOVSBL} (Ch: (C_WOp2, C_None, C_None)),
{MOVSBW} (Ch: (C_WOp2, C_None, C_None)),
{MOVSWL} (Ch: (C_WOp2, C_None, C_None)),
{MOVZB} (Ch: (C_WOp2, C_None, C_None)),
{MOVZWL} (Ch: (C_WOp2, C_None, C_None)),
{POPA} (Ch: (C_None, C_None, C_None)), {don't know value of any register}
{IN} (Ch: (C_WOp2, C_None, C_None)),
{OUT} (Ch: (C_None, C_None, C_None)),
{MOVSB} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVSBL} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVSBW} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVSWL} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVZB} (Ch: (C_WOp2, C_ROp1, C_None)),
{MOVZWL} (Ch: (C_WOp2, C_ROp1, C_None)),
{POPA} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{IN} (Ch: (C_WOp2, C_ROp1, C_None)),
{OUT} (Ch: (C_ROp1, C_ROp2, C_None)),
{LDS} (Ch: (C_WOp2, C_None, C_None)),
{LCS} (Ch: (C_WOp2, C_None, C_None)),
{LES} (Ch: (C_WOp2, C_None, C_None)),
{LFS} (Ch: (C_WOp2, C_None, C_None)),
{LGS} (Ch: (C_WOp2, C_None, C_None)),
{LSS} (Ch: (C_WOp2, C_None, C_None)),
{POPF} (Ch: (C_RWESP, C_Flags, C_None)),
{SBB} (Ch: (C_RWOp2, C_Flags, C_None)),
{ADC} (Ch: (C_RWOp2, C_Flags, C_None)),
{DIV} (Ch: (C_RWEAX, C_WEDX, C_Flags)),
{ROR} (Ch: (C_RWOp2, C_Flags, C_None)),
{ROL} (Ch: (C_RWOp2, C_Flags, C_None)),
{RCL} (Ch: (C_RWOp2, C_Flags, C_None)),
{RCR} (Ch: (C_RWOp2, C_Flags, C_None)),
{SAL} (Ch: (C_RWOp2, C_Flags, C_None)),
{SHLD} (Ch: (C_RWOp3, C_Flags, C_None)),
{SHRD} (Ch: (C_RWOp3, C_Flags, C_None)),
{POPF} (Ch: (C_RWESP, C_WFlags, C_None)),
{SBB} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{ADC} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{DIV} (Ch: (C_RWEAX, C_WEDX, C_WFlags)),
{ROR} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{ROL} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{RCL} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{RCR} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{SAL} (Ch: (C_RWOp2, C_ROp1, C_RWFlags)),
{SHLD} (Ch: (C_RWOp3, C_RWFlags, C_ROp2)),
{SHRD} (Ch: (C_RWOp3, C_RWFlags, C_ROp1)),
{LCALL} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{LJMP} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{LRET} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{JNAE} (Ch: (C_None, C_None, C_None)),
{JNB} (Ch: (C_None, C_None, C_None)),
{JNA} (Ch: (C_None, C_None, C_None)),
{JNBE} (Ch: (C_None, C_None, C_None)),
{JP} (Ch: (C_None, C_None, C_None)),
{JNP} (Ch: (C_None, C_None, C_None)),
{JPE} (Ch: (C_None, C_None, C_None)),
{JPO} (Ch: (C_None, C_None, C_None)),
{JNGE} (Ch: (C_None, C_None, C_None)),
{JNG} (Ch: (C_None, C_None, C_None)),
{JNL} (Ch: (C_None, C_None, C_None)),
{JNLE} (Ch: (C_None, C_None, C_None)),
{JCXZ} (Ch: (C_None, C_None, C_None)),
{JECXZ} (Ch: (C_None, C_None, C_None)),
{JNAE} (Ch: (C_RFlags, C_None, C_None)),
{JNB} (Ch: (C_RFlags, C_None, C_None)),
{JNA} (Ch: (C_RFlags, C_None, C_None)),
{JNBE} (Ch: (C_RFlags, C_None, C_None)),
{JP} (Ch: (C_RFlags, C_None, C_None)),
{JNP} (Ch: (C_RFlags, C_None, C_None)),
{JPE} (Ch: (C_RFlags, C_None, C_None)),
{JPO} (Ch: (C_RFlags, C_None, C_None)),
{JNGE} (Ch: (C_RFlags, C_None, C_None)),
{JNG} (Ch: (C_RFlags, C_None, C_None)),
{JNL} (Ch: (C_RFlags, C_None, C_None)),
{JNLE} (Ch: (C_RFlags, C_None, C_None)),
{JCXZ} (Ch: (C_RECX, C_None, C_None)),
{JECXZ} (Ch: (C_RECX, C_None, C_None)),
{LOOP} (Ch: (C_RWECX, C_None, C_None)),
{CMPS} (Ch: (C_RWESI, C_RWEDI, C_Flags)),
{CMPS} (Ch: (C_RWESI, C_RWEDI, C_WFlags)),
{INS} (Ch: (C_RWEDI, C_MemEDI, C_None)),
{OUTS} (Ch: (C_RWESI, C_None, C_None)),
{SCAS} (Ch: (C_RWEDI, C_Flags, C_None)),
{BSF} (Ch: (C_WOp2, C_Flags, C_None)),
{BSR} (Ch: (C_WOp2, C_Flags, C_None)),
{BT} (Ch: (C_Flags, C_None, C_None)),
{BTC} (Ch: (C_RWOp2, C_Flags, C_None)),
{BTR} (Ch: (C_RWOp2, C_Flags, C_None)),
{BTS} (Ch: (C_RWOp2, C_Flags, C_None)),
{SCAS} (Ch: (C_RWEDI, C_WFlags, C_None)),
{BSF} (Ch: (C_WOp2, C_WFlags, C_ROp1)),
{BSR} (Ch: (C_WOp2, C_WFlags, C_ROp1)),
{BT} (Ch: (C_WFlags, C_ROp1, C_None)),
{BTC} (Ch: (C_RWOp2, C_ROp1, C_WFlags)),
{BTR} (Ch: (C_RWOp2, C_ROp1, C_WFlags)),
{BTS} (Ch: (C_RWOp2, C_ROp1, C_WFlags)),
{INT} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{INT3} (Ch: (C_None, C_None, C_None)),
{INTO} (Ch: (C_All, C_None, C_None)), {don't know value of any register}
{BOUNDL} (Ch: (C_None, C_None, C_None)),
{BOUNDW} (Ch: (C_None, C_None, C_None)),
{LOOPZ} (Ch: (C_RWECX, C_None, C_None)),
{LOOPE} (Ch: (C_RWECX, C_None, C_None)),
{LOOPNZ} (Ch: (C_RWECX, C_None, C_None)),
{LOOPNE} (Ch: (C_RWECX, C_None, C_None)),
{SETO} (Ch: (C_WOp1, C_None, C_None)),
{SETNO} (Ch: (C_WOp1, C_None, C_None)),
{SETNAE} (Ch: (C_WOp1, C_None, C_None)),
{SETNB} (Ch: (C_WOp1, C_None, C_None)),
{SETZ} (Ch: (C_WOp1, C_None, C_None)),
{SETNZ} (Ch: (C_WOp1, C_None, C_None)),
{SETNA} (Ch: (C_WOp1, C_None, C_None)),
{SETNBE} (Ch: (C_WOp1, C_None, C_None)),
{SETS} (Ch: (C_WOp1, C_None, C_None)),
{SETNS} (Ch: (C_WOp1, C_None, C_None)),
{SETP} (Ch: (C_WOp1, C_None, C_None)),
{SETPE} (Ch: (C_WOp1, C_None, C_None)),
{SETNP} (Ch: (C_WOp1, C_None, C_None)),
{SETPO} (Ch: (C_WOp1, C_None, C_None)),
{SETNGE} (Ch: (C_WOp1, C_None, C_None)),
{SETNL} (Ch: (C_WOp1, C_None, C_None)),
{SETNG} (Ch: (C_WOp1, C_None, C_None)),
{SETNLE} (Ch: (C_WOp1, C_None, C_None)),
{ARPL} (Ch: (C_Flags, C_None, C_None)),
{BOUNDL} (Ch: (C_ROp1, C_None, C_None)),
{BOUNDW} (Ch: (C_ROp1, C_None, C_None)),
{LOOPZ} (Ch: (C_RWECX, C_RFlags, C_None)),
{LOOPE} (Ch: (C_RWECX, C_RFlags, C_None)),
{LOOPNZ} (Ch: (C_RWECX, C_RFlags, C_None)),
{LOOPNE} (Ch: (C_RWECX, C_RFlags, C_None)),
{SETO} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNO} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNAE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNB} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETZ} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNZ} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNA} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNBE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETS} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNS} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETP} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETPE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNP} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETPO} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNGE} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNL} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNG} (Ch: (C_WOp1, C_RFlags, C_None)),
{SETNLE} (Ch: (C_WOp1, C_RFlags, C_None)),
{ARPL} (Ch: (C_WFlags, C_None, C_None)),
{LAR} (Ch: (C_WOp2, C_None, C_None)),
{LGDT} (Ch: (C_None, C_None, C_None)),
{LIDT} (Ch: (C_None, C_None, C_None)),
{LLDT} (Ch: (C_None, C_None, C_None)),
{LMSW} (Ch: (C_None, C_None, C_None)),
{LSL} (Ch: (C_WOp2, C_Flags, C_None)),
{LSL} (Ch: (C_WOp2, C_WFlags, C_None)),
{LTR} (Ch: (C_None, C_None, C_None)),
{SGDT} (Ch: (C_WOp1, C_None, C_None)),
{SIDT} (Ch: (C_WOp1, C_None, C_None)),
{SLDT} (Ch: (C_WOp1, C_None, C_None)),
{SMSW} (Ch: (C_WOp1, C_None, C_None)),
{STR} (Ch: (C_WOp1, C_None, C_None)),
{VERR} (Ch: (C_Flags, C_None, C_None)),
{VERW} (Ch: (C_Flags, C_None, C_None)),
{VERR} (Ch: (C_WFlags, C_None, C_None)),
{VERW} (Ch: (C_WFlags, C_None, C_None)),
{FABS} (Ch: (C_FPU, C_None, C_None)),
{FBLD} (Ch: (C_FPU, C_None, C_None)),
{FBSTP} (Ch: (C_WOp1, C_None, C_None)),
@ -546,10 +550,10 @@ Const AsmInstr: Array[tasmop] Of TAsmInstrucProp = (
{FIDIVRL}(Ch: (C_FPU, C_None, C_None)),
{FDIVRL} (Ch: (C_FPU, C_None, C_None)),
{FIDIVRS}(Ch: (C_FPU, C_None, C_None)),
{REPE} (Ch: (C_RWECX, C_None, C_None)),
{REPNE} (Ch: (C_RWECX, C_None, C_None)),
{REPE} (Ch: (C_RWECX, C_RFlags, C_None)),
{REPNE} (Ch: (C_RWECX, C_RFlags, C_None)),
{FADDS} (Ch: (C_FPU, C_None, C_None)),
{POPFD} (Ch: (C_RWESP, C_Flags, C_None)),
{POPFD} (Ch: (C_RWESP, C_WFlags, C_None)),
{below are the MMX instructions}
{A_EMMS} (Ch: (C_FPU, C_None, C_None)),
{A_MOVD} (Ch: (C_WOp2, C_None, C_None)),
@ -672,7 +676,9 @@ Procedure BuildLabelTableAndFixRegAlloc(AsmL: PAasmOutput; Var LabelTable: PLabe
{Builds a table with the locations of the labels in the paasmoutput.
Also fixes some RegDeallocs like "# %eax released; push (%eax)"}
Var p, hp1, hp2: Pai;
UsedRegs: TRegSet;
Begin
UsedRegs := [];
If (LabelDif <> 0) Then
Begin
{$IfDef TP}
@ -685,23 +691,49 @@ Begin
p := pai(AsmL^.first);
While Assigned(p) Do
Begin
If (p^.typ = ait_label) And
(Pai_Label(p)^.l^.is_used) Then
LabelTable^[Pai_Label(p)^.l^.nb-LowLabel].PaiObj := p
Else
If (p^.typ = ait_regdealloc) And
Not(FindRegAlloc(PaiRegAlloc(p)^.Reg, Pai(p^.Next))) And
GetNextInstruction(p, hp1) And
(RegInInstruction(PaiRegAlloc(p)^.Reg, hp1)) Then
Case p^.typ Of
ait_Label:
If Pai_Label(p)^.l^.is_used Then
LabelTable^[Pai_Label(p)^.l^.nb-LowLabel].PaiObj := p;
ait_RegAlloc:
Begin
hp2 := Pai(p^.previous);
AsmL^.Remove(p);
InsertLLItem(AsmL, hp1, Pai(hp1^.Next), p);
p := hp2;
If Not(PaiRegAlloc(p)^.Reg in UsedRegs) Then
UsedRegs := UsedRegs + [PaiRegAlloc(p)^.Reg]
Else
Begin
hp1 := p;
hp2 := nil;
While GetLastInstruction(hp1, hp1) And
Not(RegInInstruction(PaiRegAlloc(p)^.Reg, hp1)) Do
hp2 := hp1;
If hp2 <> nil Then
Begin
hp1 := New(PaiRegDeAlloc, Init(PaiRegAlloc(p)^.Reg));
InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp1);
End;
End;
End;
ait_RegDeAlloc:
Begin
UsedRegs := UsedRegs - [PaiRegDeAlloc(p)^.Reg];
hp1 := p;
hp2 := nil;
While Not(FindRegAlloc(PaiRegDeAlloc(p)^.Reg, Pai(hp1^.Next))) And
GetNextInstruction(hp1, hp1) And
RegInInstruction(PaiRegDeAlloc(p)^.Reg, hp1) Do
hp2 := hp1;
If hp2 <> nil Then
Begin
hp1 := Pai(p^.previous);
AsmL^.Remove(p);
InsertLLItem(AsmL, hp2, Pai(hp2^.Next), p);
p := hp1;
End;
End;
End;
P := Pai(p^.Next);
While Assigned(p) And
(p^.typ in (SkipInstr - [ait_regdealloc])) Do
(p^.typ in (SkipInstr - [ait_regdealloc,ait_regalloc])) Do
P := Pai(P^.Next);
End;
{$IfDef TP}
@ -967,8 +999,8 @@ Begin
If GetLastInstruction(p1, hp)
Then
RegModifiedByInstruction :=
PPAiProp(p1^.fileinfo.line)^.Regs[Reg].State <>
PPAiProp(hp^.fileinfo.line)^.Regs[Reg].State
PPAiProp(p1^.fileinfo.line)^.Regs[Reg].WState <>
PPAiProp(hp^.fileinfo.line)^.Regs[Reg].WState
Else RegModifiedByInstruction := True;
End;
@ -1047,8 +1079,8 @@ End;
Procedure UpdateUsedRegs(Var UsedRegs: TRegSet; p: Pai);
{updates UsedRegs with the RegAlloc Information coming after P}
Var hp: Pai;
Begin
{ p := Pai(p^.next);}
Repeat
While Assigned(p) And
((p^.typ in (SkipInstr - [ait_RegAlloc, ait_RegDealloc])) or
@ -1060,7 +1092,7 @@ Begin
Begin
Case p^.typ Of
ait_RegAlloc: UsedRegs := UsedRegs + [PaiRegAlloc(p)^.Reg];
ait_regdealloc: UsedRegs := UsedRegs - [PaiRegAlloc(p)^.Reg];
ait_regdealloc: UsedRegs := UsedRegs - [PaiRegDeAlloc(p)^.Reg];
End;
p := pai(p^.next);
End;
@ -1101,11 +1133,11 @@ Begin
Else InternalError($db)
End;
Procedure IncState(Var S: Word);
Procedure IncState(Var S: Byte);
{Increases S by 1, wraps around at $ffff to 0 (so we won't get overflow
errors}
Begin
If (s <> $ffff)
If (s <> $ff)
Then Inc(s)
Else s := 0
End;
@ -1154,7 +1186,7 @@ End;
Procedure DestroyReg(p1: PPaiProp; Reg: TRegister);
{Destroys the contents of the register Reg in the PPaiProp p1, as well as the
contents of registers are loaded with a memory location based on Reg}
Var TmpState: Longint;
Var TmpState: Byte;
Counter: TRegister;
Begin
Reg := Reg32(Reg);
@ -1164,10 +1196,10 @@ Begin
Begin
With p1^.Regs[Reg] Do
Begin
IncState(State);
TmpState := State;
IncState(WState);
TmpState := WState;
FillChar(p1^.Regs[Reg], SizeOf(TContent), 0);
State := TmpState;
WState := TmpState;
End;
For Counter := R_EAX to R_EDI Do
With p1^.Regs[Counter] Do
@ -1175,10 +1207,10 @@ Begin
RegInSequence(Reg, p1^.Regs[Counter])
Then
Begin
IncState(State);
TmpState := State;
IncState(WState);
TmpState := WState;
FillChar(p1^.Regs[Counter], SizeOf(TContent), 0);
State := TmpState;
WState := TmpState;
End;
End;
End;
@ -1238,15 +1270,6 @@ Begin {checks whether the two ops are equal}
End;
End; *)
(* Function RegsSameContent(p1, p2: Pai; Reg: TRegister): Boolean;
{checks whether Reg has the same content in the PPaiProp of p1 and p2}
Begin
Reg := Reg32(Reg);
RegsSameContent :=
PPaiProp(p1^.fileinfo.line)^.Regs[Reg].State =
PPaiProp(p2^.fileinfo.line)^.Regs[Reg].State;
End; *)
Function InstructionsEquivalent(p1, p2: Pai; Var RegInfo: TRegInfo): Boolean;
Begin {checks whether two Pai386 instructions are equal}
If Assigned(p1) And Assigned(p2) And
@ -1498,7 +1521,7 @@ First: Pai): Pai;
Var
CurProp: PPaiProp;
{$ifdef AnalyzeLoops}
TmpState,
TmpState: Byte;
{$endif AnalyzeLoops}
Cnt, InstrCnt : Longint;
InstrProp: TAsmInstrucProp;
@ -1539,18 +1562,11 @@ Begin
Begin
FillChar(CurProp^, SizeOf(CurProp^), 0);
{ For TmpReg := R_EAX to R_EDI Do
CurProp^.Regs[TmpReg].State := 1;}
CurProp^.Regs[TmpReg].WState := 1;}
End;
CurProp^.UsedRegs := UsedRegs;
CurProp^.CanBeRemoved := False;
UpdateUsedRegs(UsedRegs, Pai(p^.Next));
{$ifdef csdebug}
If R_EAX in usedregs then
begin
hp := new(pai_asm_comment,init(strpnew('eax in set')));
InsertLLItem(AsmL, p, p^.next, hp);
end;
{$endif csdebug}
{$ifdef TP}
CurProp^.linesave := p^.fileinfo.line;
PPaiProp(p^.fileinfo.line) := CurProp;
@ -1588,8 +1604,8 @@ Begin
previous intruction has been executed have to be taken into account as well}
For TmpReg := R_EAX to R_EDI Do
Begin
If (CurProp^.Regs[TmpReg].State <>
PPaiProp(hp^.FileInfo.Line)^.Regs[TmpReg].State)
If (CurProp^.Regs[TmpReg].WState <>
PPaiProp(hp^.FileInfo.Line)^.Regs[TmpReg].WState)
Then DestroyReg(CurProp, TmpReg)
End
End
@ -1670,8 +1686,8 @@ Begin
Else
Begin
For TmpReg := R_EAX to R_EDI Do
If (PaiPropBlock^[InstrNr].Regs[TmpReg].State <>
CurProp^.Regs[TmpReg].State) Then
If (PaiPropBlock^[InstrNr].Regs[TmpReg].WState <>
CurProp^.Regs[TmpReg].WState) Then
DestroyReg(@PaiPropBlock^[InstrNr], TmpReg);
Inc(JmpsProcessed);
End
@ -1688,20 +1704,20 @@ Begin
Begin
Inc(JmpsProcessed);
For TmpReg := R_EAX to R_EDI Do
If (PaiPropBlock^[InstrNr].Regs[TmpReg].State <>
CurProp^.Regs[TmpReg].State)
If (PaiPropBlock^[InstrNr].Regs[TmpReg].WState <>
CurProp^.Regs[TmpReg].WState)
Then
Begin
TmpState := PaiPropBlock^[InstrNr].Regs[TmpReg].State;
TmpState := PaiPropBlock^[InstrNr].Regs[TmpReg].WState;
Cnt := InstrNr;
While (TmpState = PaiPropBlock^[Cnt].Regs[TmpReg].State) Do
While (TmpState = PaiPropBlock^[Cnt].Regs[TmpReg].WState) Do
Begin
DestroyReg(@PaiPropBlock^[Cnt], TmpReg);
Inc(Cnt);
End;
While (Cnt <= InstrCnt) Do
Begin
Inc(PaiPropBlock^[Cnt].Regs[TmpReg].State);
Inc(PaiPropBlock^[Cnt].Regs[TmpReg].WState);
Inc(Cnt)
End
End;
@ -1713,22 +1729,22 @@ Begin
Inc(JmpsProcessed);
For TmpReg := R_EAX to R_EDI Do
Begin
TmpState := PaiPropBlock^[InstrNr].Regs[TmpReg].State;
TmpState := PaiPropBlock^[InstrNr].Regs[TmpReg].WState;
Cnt := InstrNr;
While (TmpState = PaiPropBlock^[Cnt].Regs[TmpReg].State) Do
While (TmpState = PaiPropBlock^[Cnt].Regs[TmpReg].WState) Do
Begin
PaiPropBlock^[Cnt].Regs[TmpReg] := CurProp^.Regs[TmpReg];
Inc(Cnt);
End;
TmpState := PaiPropBlock^[InstrNr].Regs[TmpReg].State;
While (TmpState = PaiPropBlock^[Cnt].Regs[TmpReg].State) Do
TmpState := PaiPropBlock^[InstrNr].Regs[TmpReg].WState;
While (TmpState = PaiPropBlock^[Cnt].Regs[TmpReg].WState) Do
Begin
DestroyReg(@PaiPropBlock^[Cnt], TmpReg);
Inc(Cnt);
End;
While (Cnt <= InstrCnt) Do
Begin
Inc(PaiPropBlock^[Cnt].Regs[TmpReg].State);
Inc(PaiPropBlock^[Cnt].Regs[TmpReg].WState);
Inc(Cnt)
End
End
@ -1768,7 +1784,7 @@ Begin
Begin
With CurProp^.Regs[TmpReg] Do
Begin
IncState(State);
IncState(WState);
{also store how many instructions are part of the sequence in the first
instructions PPaiProp, so it can be easily accessed from within
CheckSequence}
@ -1788,7 +1804,7 @@ Begin
End;
End;
{$ifdef StateDebug}
hp := new(pai_asm_comment,init(strpnew(att_reg2str[TmpReg]+': '+tostr(CurProp^.Regs[TmpReg].State))));
hp := new(pai_asm_comment,init(strpnew(att_reg2str[TmpReg]+': '+tostr(CurProp^.Regs[TmpReg].WState))));
InsertLLItem(AsmL, p, p^.next, hp);
{$endif StateDebug}
@ -1801,8 +1817,6 @@ Begin
TmpReg := Reg32(TRegister(Pai386(p)^.op2));
With CurProp^.Regs[TmpReg] Do
Begin
{it doesn't matter that the state is changed,
it isn't looked at when removing constant reloads}
DestroyReg(CurProp, TmpReg);
typ := Con_Const;
StartMod := Pai386(p)^.op1;
@ -1851,9 +1865,13 @@ Begin
(InstrProp.Ch[Cnt] <> C_None) Do
Begin
Case InstrProp.Ch[Cnt] Of
C_REAX..C_REDI: ;
C_WEAX..C_RWEDI: DestroyReg(CurProp, TCh2Reg(InstrProp.Ch[Cnt]));
C_CDirFlag: CurProp^.DirFlag := F_NotSet;
C_SDirFlag: CurProp^.DirFlag := F_Set;
C_ROp1:;
C_ROp2:;
C_ROp3:;
C_WOp1..C_RWOp1: Destroy(p, Pai386(p)^.op1t, Pai386(p)^.op1);
C_WOp2..C_RWOp2: Destroy(p, Pai386(p)^.op2t, Pai386(p)^.op2);
C_WOp3..C_RWOp3: Destroy(p, Pai386(p)^.op3t, Pointer(Longint(TwoWords(Pai386(p)^.op2).word2)));
@ -1863,7 +1881,7 @@ Begin
TmpRef.Base := R_EDI;
DestroyRefs(p, TmpRef, R_NO)
End;
C_Flags, C_FPU:
C_RFlags, C_WFlags, C_RWFlags, C_FPU:
Else
Begin
DestroyAllRegs(CurProp);
@ -1898,7 +1916,7 @@ Begin
NrOfPaiObjs := 0;
While Assigned(P) Do
Begin
{$IfNDef TP}
{$IfDef JumpAnal}
Case P^.Typ Of
ait_labeled_instruction:
begin
@ -1920,7 +1938,7 @@ Begin
TmpStr := StrPas(PCSymbol(Pai386(p)^.op1)^.symbol);
If}
End;
{$EndIf TP}
{$EndIf JumpAnal}
Inc(NrOfPaiObjs);
GetNextInstruction(p, p);
End;
@ -1973,7 +1991,13 @@ End.
{
$Log$
Revision 1.17 1998-10-02 17:30:20 jonas
Revision 1.18 1998-10-07 16:27:02 jonas
* changed state to WState (WriteState), added RState for future use in
instruction scheduling
* RegAlloc data from the CG is now completely being patched and corrected (I
think)
Revision 1.17 1998/10/02 17:30:20 jonas
* small patches to regdealloc data
Revision 1.16 1998/10/01 20:21:47 jonas
@ -1983,7 +2007,7 @@ End.
* small compiling problems fixed
Revision 1.14 1998/09/20 17:12:36 jonas
* small fix for uncertain optimizations & more cleaning up
* small fix for uncertain optimizations & more cleaning up
Revision 1.12 1998/09/16 18:00:01 jonas
* optimizer now completely dependant on GetNext/GetLast instruction, works again with -dRegAlloc