Browse Source

+ take into account the x86 segment register in TAOptBase.RegInRef

git-svn-id: trunk@36078 -
nickysn 8 years ago
parent
commit
9b7a8f0da5
1 changed files with 8 additions and 0 deletions
  1. 8 0
      compiler/aoptbase.pas

+ 8 - 0
compiler/aoptbase.pas

@@ -160,6 +160,14 @@ unit aoptbase;
 {$ifdef cpurefshaveindexreg}
 {$ifdef cpurefshaveindexreg}
     Or SuperRegistersEqual(Ref.Index,Reg)
     Or SuperRegistersEqual(Ref.Index,Reg)
 {$endif cpurefshaveindexreg}
 {$endif cpurefshaveindexreg}
+{$ifdef x86}
+    or (Reg=Ref.segment)
+    { if Ref.segment isn't set, the cpu uses implicitly ss or ds, depending on the base register }
+    or ((Ref.segment=NR_NO) and (
+      ((Reg=NR_SS) and (SuperRegistersEqual(Ref.base,NR_EBP) or SuperRegistersEqual(Ref.base,NR_ESP))) or
+      ((Reg=NR_DS) and not(SuperRegistersEqual(Ref.base,NR_EBP) or SuperRegistersEqual(Ref.base,NR_ESP)))
+    ))
+{$endif x86}
   End;
   End;
 
 
   Function TAOptBase.RegModifiedByInstruction(Reg: TRegister; p1: tai): Boolean;
   Function TAOptBase.RegModifiedByInstruction(Reg: TRegister; p1: tai): Boolean;