Jelajahi Sumber

+ implemented huge pointer arithmetic

git-svn-id: trunk@28139 -
nickysn 11 tahun lalu
induk
melakukan
d9e94ffab7
1 mengubah file dengan 45 tambahan dan 2 penghapusan
  1. 45 2
      compiler/i8086/n8086add.pas

+ 45 - 2
compiler/i8086/n8086add.pas

@@ -35,6 +35,8 @@ interface
        ti8086addnode = class(tx86addnode)
          function simplify(forinline: boolean) : tnode;override;
          function use_generic_mul32to64: boolean; override;
+         function first_addpointer: tnode; override;
+         function first_addhugepointer: tnode;
          procedure second_addordinal; override;
          procedure second_add64bit;override;
          procedure second_addfarpointer;
@@ -48,11 +50,11 @@ interface
 
     uses
       globtype,systems,
-      cutils,verbose,globals,constexp,
+      cutils,verbose,globals,constexp,pass_1,
       symconst,symdef,symtype,paramgr,defutil,
       aasmbase,aasmtai,aasmdata,aasmcpu,
       cgbase,procinfo,
-      ncon,nset,cgutils,tgobj,
+      ncal,ncon,nset,cgutils,tgobj,
       cga,ncgutil,cgobj,cg64f32,cgx86,
       hlcgobj;
 
@@ -308,6 +310,47 @@ interface
       end;
 
 
+    function ti8086addnode.first_addpointer: tnode;
+      begin
+        if is_hugepointer(left.resultdef) xor is_hugepointer(right.resultdef) then
+          result:=first_addhugepointer
+        else
+          result:=inherited;
+      end;
+
+
+    function ti8086addnode.first_addhugepointer: tnode;
+      var
+        procname:string;
+      begin
+        result:=nil;
+
+        case nodetype of
+          addn:
+            procname:='fpc_hugeptr_add_longint';
+          subn:
+            procname:='fpc_hugeptr_sub_longint';
+          else
+            internalerror(2014070301);
+        end;
+
+        if cs_hugeptr_normalization in current_settings.localswitches then
+          procname:=procname+'_normalized';
+
+        if is_hugepointer(left.resultdef) then
+          result := ccallnode.createintern(procname,
+            ccallparanode.create(right,
+            ccallparanode.create(left,nil)))
+        else
+          result := ccallnode.createintern(procname,
+            ccallparanode.create(left,
+            ccallparanode.create(right,nil)));
+        left := nil;
+        right := nil;
+        firstpass(result);
+      end;
+
+
     procedure ti8086addnode.second_addfarpointer;
       var
         tmpreg : tregister;