Browse Source

* avoid some unnecessary bool->int->bool type conversions

git-svn-id: trunk@3184 -
Jonas Maebe 19 years ago
parent
commit
039e7143f4
3 changed files with 22 additions and 9 deletions
  1. 2 2
      compiler/nadd.pas
  2. 12 4
      compiler/ncgcnv.pas
  3. 8 3
      compiler/ncnv.pas

+ 2 - 2
compiler/nadd.pas

@@ -818,13 +818,13 @@ implementation
                 if torddef(left.resulttype.def).size>torddef(right.resulttype.def).size then
                  begin
                    right:=ctypeconvnode.create_internal(right,left.resulttype);
-                   ttypeconvnode(right).convtype:=tc_bool_2_int;
+                   ttypeconvnode(right).convtype:=tc_bool_2_bool;
                    resulttypepass(right);
                  end
                 else if torddef(left.resulttype.def).size<torddef(right.resulttype.def).size then
                  begin
                    left:=ctypeconvnode.create_internal(left,right.resulttype);
-                   ttypeconvnode(left).convtype:=tc_bool_2_int;
+                   ttypeconvnode(left).convtype:=tc_bool_2_bool;
                    resulttypepass(left);
                  end;
                 case nodetype of

+ 12 - 4
compiler/ncgcnv.pas

@@ -392,10 +392,18 @@ interface
           the bits that define the true status can be outside the limits
           of the new size and truncating the register can result in a 0
           value }
-        if resulttype.def.size<left.resulttype.def.size then
-          second_int_to_bool
-        else
-          second_bool_to_int;
+        if (left.expectloc in [LOC_FLAGS,LOC_JUMP]) then
+          begin
+            secondpass(left);
+            if (left.location.loc <> left.expectloc) then
+              internalerror(20060409);
+            location_copy(location,left.location);
+          end
+         else
+           if resulttype.def.size<left.resulttype.def.size then
+             second_int_to_bool
+           else
+             second_bool_to_int;
       end;
 
 

+ 8 - 3
compiler/ncnv.pas

@@ -2023,9 +2023,14 @@ implementation
     function ttypeconvnode.first_bool_to_bool : tnode;
       begin
          first_bool_to_bool:=nil;
-         expectloc:=LOC_REGISTER;
-         if registersint<1 then
-           registersint:=1;
+         if (left.expectloc in [LOC_FLAGS,LOC_JUMP]) then
+           expectloc := left.expectloc
+         else
+           begin
+             expectloc:=LOC_REGISTER;
+             if registersint<1 then
+               registersint:=1;
+           end;
       end;