ソースを参照

+ default implementation for for the *_checkoverflow() methods in case
setflags is false
* don't call the *_checkoverflow() methods from ncgadd with setflags
= true in case cs_check_overflow is disabled

git-svn-id: branches/jvmbackend@18314 -

Jonas Maebe 14 年 前
コミット
e4d322bcdb
2 ファイル変更35 行追加17 行削除
  1. 18 2
      compiler/hlcgobj.pas
  2. 17 15
      compiler/ncgadd.pas

+ 18 - 2
compiler/hlcgobj.pas

@@ -293,8 +293,8 @@ unit hlcgobj;
           { are any processors that support it (JM)                         }
           procedure a_op_const_reg_reg(list: TAsmList; op: TOpCg; size: tdef; a: aint; src, dst: tregister); virtual;
           procedure a_op_reg_reg_reg(list: TAsmList; op: TOpCg; size: tdef; src1, src2, dst: tregister); virtual;
-          procedure a_op_const_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tdef; a: aint; src, dst: tregister;setflags : boolean;var ovloc : tlocation); virtual; abstract;
-          procedure a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tdef; src1, src2, dst: tregister;setflags : boolean;var ovloc : tlocation); virtual; abstract;
+          procedure a_op_const_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tdef; a: aint; src, dst: tregister;setflags : boolean;var ovloc : tlocation); virtual;
+          procedure a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tdef; src1, src2, dst: tregister;setflags : boolean;var ovloc : tlocation); virtual;
 
           {  comparison operations }
           procedure a_cmp_const_reg_label(list : TAsmList;size : tdef;cmp_op : topcmp;a : aint;reg : tregister;
@@ -1367,6 +1367,22 @@ implementation
         end;
     end;
 
+  procedure thlcgobj.a_op_const_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tdef; a: aint; src, dst: tregister; setflags: boolean; var ovloc: tlocation);
+    begin
+      if not setflags then
+        a_op_const_reg_reg(list,op,size,a,src,dst)
+      else
+        internalerror(2010122910);
+    end;
+
+  procedure thlcgobj.a_op_reg_reg_reg_checkoverflow(list: TAsmList; op: TOpCg; size: tdef; src1, src2, dst: tregister; setflags: boolean; var ovloc: tlocation);
+    begin
+      if not setflags then
+        a_op_reg_reg_reg(list,op,size,src1,src2,dst)
+      else
+        internalerror(2010122911);
+    end;
+
   procedure thlcgobj.a_cmp_const_reg_label(list: TAsmList; size: tdef; cmp_op: topcmp; a: aint; reg: tregister; l: tasmlabel);
     var
       tmpreg: tregister;

+ 17 - 15
compiler/ncgadd.pas

@@ -548,7 +548,8 @@ interface
         checkoverflow:=
           checkoverflow and
           (left.resultdef.typ<>pointerdef) and
-          (right.resultdef.typ<>pointerdef);
+          (right.resultdef.typ<>pointerdef) and
+          (cs_check_overflow in current_settings.localswitches);
 
 {$ifdef cpu64bitalu}
         case nodetype of
@@ -572,12 +573,12 @@ interface
                     // reg64 - reg64
                     hlcg.a_op_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,resultdef,
                       right.location.register,left.location.register,location.register,
-                      checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc)
+                      checkoverflow,ovloc)
                   else
                     // reg64 - const64
                     hlcg.a_op_const_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,resultdef,
                       right.location.value,left.location.register,location.register,
-                      checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+                      checkoverflow,ovloc);
                 end
               else
                 begin
@@ -585,7 +586,7 @@ interface
                   hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,left.resultdef,true);
                   hlcg.a_op_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,resultdef,
                     right.location.register,left.location.register,location.register,
-                    checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+                    checkoverflow,ovloc);
                 end;
             end;
           else
@@ -598,11 +599,11 @@ interface
               if (right.location.loc = LOC_CONSTANT) then
                 cg64.a_op64_const_reg_reg_checkoverflow(current_asmdata.CurrAsmList,op,location.size,right.location.value64,
                   left.location.register64,location.register64,
-                  checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc)
+                  checkoverflow,ovloc)
               else
                 cg64.a_op64_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,op,location.size,right.location.register64,
                   left.location.register64,location.register64,
-                  checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+                  checkoverflow,ovloc);
             end;
           subn:
             begin
@@ -616,13 +617,13 @@ interface
                     cg64.a_op64_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,location.size,
                       right.location.register64,left.location.register64,
                       location.register64,
-                      checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc)
+                      checkoverflow,ovloc)
                   else
                     // reg64 - const64
                     cg64.a_op64_const_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,location.size,
                       right.location.value64,left.location.register64,
                       location.register64,
-                      checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc)
+                      checkoverflow,ovloc)
                 end
               else
                 begin
@@ -631,7 +632,7 @@ interface
                   cg64.a_op64_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,location.size,
                     right.location.register64,left.location.register64,
                     location.register64,
-                    checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+                    checkoverflow,ovloc);
                 end;
             end;
           else
@@ -739,18 +740,19 @@ interface
        checkoverflow:=
          checkoverflow and
           (left.resultdef.typ<>pointerdef) and
-          (right.resultdef.typ<>pointerdef);
+          (right.resultdef.typ<>pointerdef) and
+          (cs_check_overflow in current_settings.localswitches);
 
        if nodetype<>subn then
         begin
           if (right.location.loc<>LOC_CONSTANT) then
             hlcg.a_op_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,cgop,resultdef,
                left.location.register,right.location.register,
-               location.register,checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc)
+               location.register,checkoverflow,ovloc)
           else
             hlcg.a_op_const_reg_reg_checkoverflow(current_asmdata.CurrAsmList,cgop,resultdef,
                right.location.value,left.location.register,
-               location.register,checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+               location.register,checkoverflow,ovloc);
         end
       else  { subtract is a special case since its not commutative }
         begin
@@ -761,11 +763,11 @@ interface
               if right.location.loc<>LOC_CONSTANT then
                 hlcg.a_op_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,resultdef,
                     right.location.register,left.location.register,
-                    location.register,checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc)
+                    location.register,checkoverflow,ovloc)
               else
                 hlcg.a_op_const_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,resultdef,
                   right.location.value,left.location.register,
-                  location.register,checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+                  location.register,checkoverflow,ovloc);
             end
           else
             begin
@@ -773,7 +775,7 @@ interface
               hlcg.a_load_const_reg(current_asmdata.CurrAsmList,resultdef,
                 left.location.value,tmpreg);
               hlcg.a_op_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmList,OP_SUB,resultdef,
-                right.location.register,tmpreg,location.register,checkoverflow and (cs_check_overflow in current_settings.localswitches),ovloc);
+                right.location.register,tmpreg,location.register,checkoverflow,ovloc);
             end;
         end;