Ver código fonte

+ implemented normalized huge pointer comparison

git-svn-id: trunk@28157 -
nickysn 11 anos atrás
pai
commit
3bb730d5b9
1 arquivos alterados com 49 adições e 0 exclusões
  1. 49 0
      compiler/i8086/n8086add.pas

+ 49 - 0
compiler/i8086/n8086add.pas

@@ -37,6 +37,8 @@ interface
          function use_generic_mul32to64: boolean; override;
          function use_generic_mul32to64: boolean; override;
          function first_addpointer: tnode; override;
          function first_addpointer: tnode; override;
          function first_addhugepointer: tnode;
          function first_addhugepointer: tnode;
+         function first_cmppointer: tnode; override;
+         function first_cmphugepointer: tnode;
          procedure second_addordinal; override;
          procedure second_addordinal; override;
          procedure second_add64bit;override;
          procedure second_add64bit;override;
          procedure second_addfarpointer;
          procedure second_addfarpointer;
@@ -351,6 +353,53 @@ interface
       end;
       end;
 
 
 
 
+    function ti8086addnode.first_cmppointer: tnode;
+      begin
+        if is_hugepointer(left.resultdef) or is_hugepointer(right.resultdef) then
+          result:=first_cmphugepointer
+        else
+          result:=inherited;
+      end;
+
+
+    function ti8086addnode.first_cmphugepointer: tnode;
+      var
+        procname:string;
+      begin
+        result:=nil;
+
+        if not (cs_hugeptr_comparison_normalization in current_settings.localswitches) then
+          begin
+            expectloc:=LOC_FLAGS;
+            exit;
+          end;
+
+        case nodetype of
+          equaln:
+            procname:='fpc_hugeptr_cmp_normalized_e';
+          unequaln:
+            procname:='fpc_hugeptr_cmp_normalized_ne';
+          ltn:
+            procname:='fpc_hugeptr_cmp_normalized_b';
+          lten:
+            procname:='fpc_hugeptr_cmp_normalized_be';
+          gtn:
+            procname:='fpc_hugeptr_cmp_normalized_a';
+          gten:
+            procname:='fpc_hugeptr_cmp_normalized_ae';
+          else
+            internalerror(2014070401);
+        end;
+
+        result := ccallnode.createintern(procname,
+          ccallparanode.create(right,
+          ccallparanode.create(left,nil)));
+        left := nil;
+        right := nil;
+        firstpass(result);
+      end;
+
+
     procedure ti8086addnode.second_addfarpointer;
     procedure ti8086addnode.second_addfarpointer;
       var
       var
         tmpreg : tregister;
         tmpreg : tregister;