|
@@ -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
|
|
|
+ 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
|
|
|
- hp2 := Pai(p^.previous);
|
|
|
- AsmL^.Remove(p);
|
|
|
- InsertLLItem(AsmL, hp1, Pai(hp1^.Next), p);
|
|
|
- p := hp2;
|
|
|
+ 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
|