mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-05 12:50:23 +02:00
* some fixes to RegReadByInstr
This commit is contained in:
parent
265f3c09be
commit
1d923a08ec
@ -120,47 +120,48 @@ Begin
|
||||
RegInOp(Reg,op[0]) or
|
||||
RegInOp(Reg,op[1]) or
|
||||
((ops = 1) and
|
||||
(reg in [R_EAX,R_EDX]))
|
||||
A_IDIV, A_MUL:
|
||||
TmpResult :=
|
||||
RegInOp(Reg,op[0]) or
|
||||
(Reg = R_EAX) or
|
||||
((Reg = R_EDX) and
|
||||
(p^.opcode = A_IDIV) and
|
||||
(p^.size = S_L))
|
||||
Else
|
||||
Begin
|
||||
Cnt := 1;
|
||||
InstrProp := AsmInstr[PInstr(p)^.OpCode);
|
||||
While (Cnt <= MaxCh) And
|
||||
(InstrProp.Ch[Cnt] <> C_None) And
|
||||
Not(TmpResult) Do
|
||||
Begin
|
||||
Case InstrProp.Ch[Cnt] Of
|
||||
C_REAX..C_REDI,C_RWEAX..C_RWEDI
|
||||
{$ifdef arithopt}
|
||||
,C_MEAX..C_MEDI
|
||||
{$endif arithopt}:
|
||||
TmpResult := Reg = TCh2Reg(InstrProp.Ch[Cnt]);
|
||||
C_ROp1,C_RWOp1{$ifdef arithopt},C_Mop1{$endif arithopt}:
|
||||
TmpResult := RegInOp(PInstr(p)^.oper[0]);
|
||||
C_ROp2,C_RWOp2{$ifdef arithopt},C_Mop2{$endif arithopt}:
|
||||
TmpResult := RegInOp(PInstr(p)^.oper[1]);
|
||||
C_ROp3,C_RWOp3{$ifdef arithopt},C_Mop3{$endif arithopt}:
|
||||
TmpResult := RegInOp(PInstr(p)^.oper[2]);
|
||||
C_WOp1: TmpResult := (PInstr^.oper[0].typ = top_ref) And
|
||||
(RegInRef(Reg,PInstr^.oper[0].ref);
|
||||
C_WOp2: TmpResult := (PInstr^.oper[0].typ = top_ref) And
|
||||
(RegInRef(Reg,PInstr^.oper[0].ref);
|
||||
C_WOp3: TmpResult := (PInstr^.oper[0].typ = top_ref) And
|
||||
(RegInRef(Reg,PInstr^.oper[0].ref);
|
||||
C_WMemEDI: TmpResult := (Reg = R_EDI);
|
||||
C_FPU: TmpResult := Reg in [R_ST..R_ST7,R_MM0..R_MM7];
|
||||
End;
|
||||
Inc(Cnt);
|
||||
End
|
||||
End;
|
||||
End;
|
||||
(reg = R_EAX]))
|
||||
A_DIV, A_IDIV, A_MUL:
|
||||
TmpResult :=
|
||||
RegInOp(Reg,op[0]) or
|
||||
(Reg = R_EAX) or
|
||||
((Reg = R_EDX) and
|
||||
((p^.opcode = A_DIV) or
|
||||
(p^.opcode = A_IDIV)) and
|
||||
(p^.size = S_L))
|
||||
Else
|
||||
Begin
|
||||
Cnt := 1;
|
||||
InstrProp := AsmInstr[PInstr(p)^.OpCode);
|
||||
While (Cnt <= MaxCh) And
|
||||
(InstrProp.Ch[Cnt] <> C_None) And
|
||||
Not(TmpResult) Do
|
||||
Begin
|
||||
Case InstrProp.Ch[Cnt] Of
|
||||
C_REAX..C_REDI,C_RWEAX..C_RWEDI
|
||||
{$ifdef arithopt}
|
||||
,C_MEAX..C_MEDI
|
||||
{$endif arithopt}:
|
||||
TmpResult := Reg = TCh2Reg(InstrProp.Ch[Cnt]);
|
||||
C_ROp1,C_RWOp1{$ifdef arithopt},C_Mop1{$endif arithopt}:
|
||||
TmpResult := RegInOp(PInstr(p)^.oper[0]);
|
||||
C_ROp2,C_RWOp2{$ifdef arithopt},C_Mop2{$endif arithopt}:
|
||||
TmpResult := RegInOp(PInstr(p)^.oper[1]);
|
||||
C_ROp3,C_RWOp3{$ifdef arithopt},C_Mop3{$endif arithopt}:
|
||||
TmpResult := RegInOp(PInstr(p)^.oper[2]);
|
||||
C_WOp1: TmpResult := (PInstr^.oper[0].typ = top_ref) And
|
||||
(RegInRef(Reg,PInstr^.oper[0].ref);
|
||||
C_WOp2: TmpResult := (PInstr^.oper[0].typ = top_ref) And
|
||||
(RegInRef(Reg,PInstr^.oper[0].ref);
|
||||
C_WOp3: TmpResult := (PInstr^.oper[0].typ = top_ref) And
|
||||
(RegInRef(Reg,PInstr^.oper[0].ref);
|
||||
C_WMemEDI: TmpResult := (Reg = R_EDI);
|
||||
C_FPU: TmpResult := Reg in [R_ST..R_ST7,R_MM0..R_MM7]
|
||||
End;
|
||||
Inc(Cnt)
|
||||
End
|
||||
End
|
||||
End
|
||||
End;
|
||||
|
||||
{ ********************* TRegInfoCpu *****************}
|
||||
@ -211,8 +212,11 @@ End;
|
||||
End.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.3 1999-08-10 12:40:20 jonas
|
||||
+ implemented RegReadByInstr
|
||||
Revision 1.4 1999-08-11 14:23:39 jonas
|
||||
* some fixes to RegReadByInstr
|
||||
|
||||
Revision 1.3 1999/08/10 12:40:20 jonas
|
||||
+ implemented RegReadByInstr
|
||||
|
||||
Revision 1.1 1999/08/08 13:24:50 jonas
|
||||
+ added copyright header/GNU license info
|
||||
|
Loading…
Reference in New Issue
Block a user