浏览代码

* override tcgvecnode.update_reference_reg_mul for i8086 and add code that
preserves the reference segment (because reference_reset_base, which is
sometimes used by the base method, kills the segment)

git-svn-id: trunk@27480 -

nickysn 11 年之前
父节点
当前提交
f00f7d6ee7
共有 1 个文件被更改,包括 18 次插入2 次删除
  1. 18 2
      compiler/i8086/n8086mem.pas

+ 18 - 2
compiler/i8086/n8086mem.pas

@@ -41,6 +41,11 @@ interface
          procedure pass_generate_code;override;
        end;
 
+       { tx86vecnode doesn't work for i8086, so we inherit tcgvecnode }
+       ti8086vecnode = class(tcgvecnode)
+         procedure update_reference_reg_mul(maybe_const_reg:tregister;l:aint);override;
+       end;
+
 implementation
 
     uses
@@ -161,10 +166,21 @@ implementation
           inherited pass_generate_code;
       end;
 
+{*****************************************************************************
+                             TI8086VECNODE
+*****************************************************************************}
+
+    procedure ti8086vecnode.update_reference_reg_mul(maybe_const_reg:tregister;l:aint);
+      var
+        saveseg: TRegister;
+      begin
+        saveseg:=location.reference.segment;
+        inherited update_reference_reg_mul(maybe_const_reg,l);
+        location.reference.segment:=saveseg;
+      end;
 
 begin
   caddrnode:=ti8086addrnode;
   cderefnode:=ti8086derefnode;
-  { override tx86vecnode, which doesn't work for i8086 }
-  cvecnode:=tcgvecnode;
+  cvecnode:=ti8086vecnode;
 end.