diff --git a/compiler/daopt386.pas b/compiler/daopt386.pas index e314a8279b..9ff92d518b 100644 --- a/compiler/daopt386.pas +++ b/compiler/daopt386.pas @@ -296,7 +296,7 @@ Begin If hp2 <> nil Then Begin hp1 := New(PaiRegAlloc, DeAlloc(PaiRegAlloc(p)^.Reg)); - InsertLLItem(AsmL, Pai(hp2^.previous), hp2, hp1); + InsertLLItem(AsmL, hp2, hp2^.next, hp1); End; End; End @@ -363,6 +363,23 @@ End; {************************ Some general functions ************************} +Function TCh2Reg(Ch: TInsChange): TRegister; +{converts a TChange variable to a TRegister} +Begin + If (Ch <= Ch_REDI) Then + TCh2Reg := TRegister(Byte(Ch)) + Else + If (Ch <= Ch_WEDI) Then + TCh2Reg := TRegister(Byte(Ch) - Byte(Ch_REDI)) + Else + If (Ch <= Ch_RWEDI) Then + TCh2Reg := TRegister(Byte(Ch) - Byte(Ch_WEDI)) + Else + If (Ch <= Ch_MEDI) Then + TCh2Reg := TRegister(Byte(Ch) - Byte(Ch_RWEDI)) + Else InternalError($db) +End; + Function Reg32(Reg: TRegister): TRegister; {Returns the 32 bit component of Reg if it exists, otherwise Reg is returned} Begin @@ -587,7 +604,7 @@ Begin (Reg = o.ref^.Index); End; End;} - +(* Function RegModifiedByInstruction(Reg: TRegister; p1: Pai): Boolean; {returns true if Reg is modified by the instruction p1. P1 is assumed to be of the type ait_instruction} @@ -600,6 +617,57 @@ Begin PPAiProp(hp^.OptInfo)^.Regs[Reg].WState Else RegModifiedByInstruction := True; End; +*) + +Function RegModifiedByInstruction(Reg: TRegister; p1: Pai): Boolean; +Var InstrProp: TInsProp; + TmpResult: Boolean; + Cnt: Byte; +Begin + TmpResult := False; + Reg := Reg32(Reg); + If (p1^.typ = ait_instruction) Then + Case paicpu(p1)^.opcode of + A_IMUL: + With paicpu(p1)^ Do + TmpResult := + ((ops = 1) and (reg = R_EAX)) or + ((ops = 2) and (Reg32(oper[1].reg) = reg)) or + ((ops = 3) and (Reg32(oper[2].reg) = reg)); + A_DIV, A_IDIV, A_MUL: + With paicpu(p1)^ Do + TmpResult := + (Reg = R_EAX) or + (Reg = R_EDX); + Else + Begin + Cnt := 1; + InstrProp := InsProp[paicpu(p1)^.OpCode]; + While (Cnt <= MaxCh) And + (InstrProp.Ch[Cnt] <> Ch_None) And + Not(TmpResult) Do + Begin + Case InstrProp.Ch[Cnt] Of + Ch_WEAX..Ch_MEDI: + TmpResult := Reg = TCh2Reg(InstrProp.Ch[Cnt]); + Ch_RWOp1,Ch_WOp1{$ifdef arithopt},C_Mop1{$endif arithopt}: + TmpResult := (paicpu(p1)^.oper[0].typ = top_reg) and + (Reg32(paicpu(p1)^.oper[0].reg) = reg); + Ch_RWOp2,Ch_WOp2{$ifdef arithopt},C_Mop2{$endif arithopt}: + TmpResult := (paicpu(p1)^.oper[1].typ = top_reg) and + (Reg32(paicpu(p1)^.oper[1].reg) = reg); + Ch_RWOp3,Ch_WOp3{$ifdef arithopt},C_Mop3{$endif arithopt}: + TmpResult := (paicpu(p1)^.oper[2].typ = top_reg) and + (Reg32(paicpu(p1)^.oper[2].reg) = reg); + Ch_FPU: TmpResult := Reg in [R_ST..R_ST7,R_MM0..R_MM7]; + Ch_ALL: TmpResult := true; + End; + Inc(Cnt) + End + End + End; + RegModifiedByInstruction := TmpResult +End; {********************* GetNext and GetLastInstruction *********************} Function GetNextInstruction(Current: Pai; Var Next: Pai): Boolean; @@ -755,23 +823,6 @@ Begin Else FindZeroReg := False; End;*) -Function TCh2Reg(Ch: TInsChange): TRegister; -{converts a TChange variable to a TRegister} -Begin - If (Ch <= Ch_REDI) Then - TCh2Reg := TRegister(Byte(Ch)) - Else - If (Ch <= Ch_WEDI) Then - TCh2Reg := TRegister(Byte(Ch) - Byte(Ch_REDI)) - Else - If (Ch <= Ch_RWEDI) Then - TCh2Reg := TRegister(Byte(Ch) - Byte(Ch_WEDI)) - Else - If (Ch <= Ch_MEDI) Then - TCh2Reg := TRegister(Byte(Ch) - Byte(Ch_RWEDI)) - Else InternalError($db) -End; - Procedure IncState(Var S: Byte); {Increases S by 1, wraps around at $ffff to 0 (so we won't get overflow errors} @@ -1879,7 +1930,10 @@ End. { $Log$ - Revision 1.67 1999-11-06 14:34:20 peter + Revision 1.68 1999-11-07 14:57:09 jonas + * much more complete/waterproof RegModifiedByInstruction() + + Revision 1.67 1999/11/06 14:34:20 peter * truncated log to 20 revs Revision 1.66 1999/11/05 16:01:46 jonas