Browse Source

* fix for boolean=true compares

peter 26 years ago
parent
commit
e7b4349a7f
1 changed files with 55 additions and 33 deletions
  1. 55 33
      compiler/tcadd.pas

+ 55 - 33
compiler/tcadd.pas

@@ -70,7 +70,8 @@ implementation
       end;
 
       var
-         t       : ptree;
+         t,hp    : ptree;
+         ot,
          lt,rt   : ttreetyp;
          rv,lv   : longint;
          rvd,lvd : bestreal;
@@ -334,38 +335,56 @@ implementation
                   andn,
                   orn:
                     begin
-                       calcregisters(p,0,0,0);
-                       make_bool_equal_size(p);
-                       p^.location.loc:=LOC_JUMP;
+                      calcregisters(p,0,0,0);
+                      make_bool_equal_size(p);
+                      p^.location.loc:=LOC_JUMP;
+                    end;
+                  xorn:
+                    begin
+                      make_bool_equal_size(p);
+                      calcregisters(p,1,0,0);
+                    end;
+                  unequaln,
+                  equaln:
+                    begin
+                      make_bool_equal_size(p);
+                      { Remove any compares with constants, becuase then
+                        we get a compare with Flags in the codegen which
+                        is not supported (PFV) }
+                      if (p^.left^.treetype=ordconstn) then
+                       begin
+                         hp:=p^.right;
+                         b:=(p^.left^.value<>0);
+                         ot:=p^.treetype;
+                         disposetree(p^.left);
+                         putnode(p);
+                         p:=hp;
+                         if (not(b) and (ot=equaln)) or
+                            (b and (ot=unequaln)) then
+                          begin
+                            p:=gensinglenode(notn,p);
+                            firstpass(p);
+                          end;
+                         exit;
+                       end;
+                      if (p^.right^.treetype=ordconstn) then
+                       begin
+                         hp:=p^.left;
+                         b:=(p^.right^.value<>0);
+                         ot:=p^.treetype;
+                         disposetree(p^.right);
+                         putnode(p);
+                         p:=hp;
+                         if (not(b) and (ot=equaln)) or
+                            (b and (ot=unequaln)) then
+                          begin
+                            p:=gensinglenode(notn,p);
+                            firstpass(p);
+                          end;
+                         exit;
+                       end;
+                      calcregisters(p,1,0,0);
                     end;
-             unequaln,
-          equaln,xorn : begin
-                          { this forces a better code generation (TEST }
-                          { instead of CMP)                            }
-                          if p^.treetype<>xorn then
-                            begin
-                               if (p^.left^.treetype=ordconstn) and
-                                 (p^.left^.value<>0) then
-                                 begin
-                                    p^.left^.value:=0;
-                                    if p^.treetype=equaln then
-                                      p^.treetype:=unequaln
-                                    else
-                                      p^.treetype:=equaln;
-                                 end;
-                               if (p^.right^.treetype=ordconstn) and
-                                 (p^.right^.value<>0) then
-                                 begin
-                                    p^.right^.value:=0;
-                                    if p^.treetype=equaln then
-                                      p^.treetype:=unequaln
-                                    else
-                                      p^.treetype:=equaln;
-                                 end;
-                            end;
-                          make_bool_equal_size(p);
-                          calcregisters(p,1,0,0);
-                        end
                 else
                   CGMessage(type_e_mismatch);
                 end;
@@ -954,7 +973,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.18  1998-12-15 17:12:35  peter
+  Revision 1.19  1998-12-30 13:35:35  peter
+    * fix for boolean=true compares
+
+  Revision 1.18  1998/12/15 17:12:35  peter
     * pointer+ord not allowed in tp mode
 
   Revision 1.17  1998/12/11 00:03:51  peter