浏览代码

* strip segment overrides, for segments, which should be equal in the current
model to the default segment of the reference in optimize_ref, when
inlineasm=false

git-svn-id: trunk@37511 -

nickysn 7 年之前
父节点
当前提交
875339993f
共有 1 个文件被更改,包括 6 次插入2 次删除
  1. 6 2
      compiler/x86/aasmcpu.pas

+ 6 - 2
compiler/x86/aasmcpu.pas

@@ -1878,7 +1878,9 @@ implementation
         else
         else
           ss_equals_ds:=segment_regs_equal(NR_DS,NR_SS);
           ss_equals_ds:=segment_regs_equal(NR_DS,NR_SS);
         { remove redundant segment overrides }
         { remove redundant segment overrides }
-        if (ref.segment<>NR_NO) and (ref.segment=get_default_segment_of_ref(ref)) then
+        if (ref.segment<>NR_NO) and
+           ((inlineasm and (ref.segment=get_default_segment_of_ref(ref))) or
+            ((not inlineasm) and (segment_regs_equal(ref.segment,get_default_segment_of_ref(ref))))) then
           ref.segment:=NR_NO;
           ref.segment:=NR_NO;
         if not is_16_bit_ref(ref) then
         if not is_16_bit_ref(ref) then
           begin
           begin
@@ -1906,7 +1908,9 @@ implementation
               end;
               end;
           end;
           end;
         { remove redundant segment overrides again }
         { remove redundant segment overrides again }
-        if (ref.segment<>NR_NO) and (ref.segment=get_default_segment_of_ref(ref)) then
+        if (ref.segment<>NR_NO) and
+           ((inlineasm and (ref.segment=get_default_segment_of_ref(ref))) or
+            ((not inlineasm) and (segment_regs_equal(ref.segment,get_default_segment_of_ref(ref))))) then
           ref.segment:=NR_NO;
           ref.segment:=NR_NO;
       end;
       end;