Browse Source

* fixed boolean() typecast

peter 26 years ago
parent
commit
3cad4fcf36
1 changed files with 18 additions and 22 deletions
  1. 18 22
      compiler/cg386cnv.pas

+ 18 - 22
compiler/cg386cnv.pas

@@ -890,12 +890,7 @@ implementation
                             pfrom^.location.register,pto^.location.register)));
                             pfrom^.location.register,pto^.location.register)));
                       end;
                       end;
           LOC_FLAGS : begin
           LOC_FLAGS : begin
-                        hregister:=reg32toreg8(hregister);
-                        emit_flag2reg(pfrom^.location.resflags,hregister);
-                        case pto^.resulttype^.size of
-                         2 : exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_BW,hregister,pto^.location.register)));
-                         4 : exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_BL,hregister,pto^.location.register)));
-                        end;
+                        emit_flag2reg(pfrom^.location.resflags,pto^.location.register);
                       end;
                       end;
            LOC_JUMP : begin
            LOC_JUMP : begin
                         getlabel(hlabel);
                         getlabel(hlabel);
@@ -919,6 +914,7 @@ implementation
     procedure second_int_to_bool(pto,pfrom : ptree;convtyp : tconverttype);
     procedure second_int_to_bool(pto,pfrom : ptree;convtyp : tconverttype);
       var
       var
         hregister : tregister;
         hregister : tregister;
+        flags     : tresflags;
       begin
       begin
          clear_location(pto^.location);
          clear_location(pto^.location);
          { byte(boolean) or word(wordbool) or longint(longbool) must
          { byte(boolean) or word(wordbool) or longint(longbool) must
@@ -938,34 +934,31 @@ implementation
                 hregister:=getregister32;
                 hregister:=getregister32;
                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                 exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
                   newreference(pfrom^.location.reference),hregister)));
                   newreference(pfrom^.location.reference),hregister)));
+                exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_L,hregister,hregister)));
+                flags:=F_NE;
               end;
               end;
             LOC_FLAGS :
             LOC_FLAGS :
               begin
               begin
                 hregister:=getregister32;
                 hregister:=getregister32;
-                emit_flag2reg(pfrom^.location.resflags,hregister);
+                flags:=pfrom^.location.resflags;
               end;
               end;
             LOC_REGISTER,LOC_CREGISTER :
             LOC_REGISTER,LOC_CREGISTER :
               begin
               begin
                 hregister:=pfrom^.location.register;
                 hregister:=pfrom^.location.register;
+                exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_L,hregister,hregister)));
+                flags:=F_NE;
               end;
               end;
-          else
-            internalerror(10062);
-          end;
-         exprasmlist^.concat(new(pai386,op_reg_reg(A_OR,S_L,hregister,hregister)));
-         hregister:=reg32toreg8(hregister);
+            else
+              internalerror(10062);
+         end;
          case pto^.resulttype^.size of
          case pto^.resulttype^.size of
-          1 : pto^.location.register:=hregister;
-          2 : begin
-                pto^.location.register:=reg8toreg16(hregister);
-                exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_BW,hregister,pto^.location.register)));
-              end;
-          4 : begin
-                pto^.location.register:=reg8toreg32(hregister);
-                exprasmlist^.concat(new(pai386,op_reg_reg(A_MOVZX,S_BL,hregister,pto^.location.register)));
-              end;
+          1 : pto^.location.register:=makereg8(hregister);
+          2 : pto^.location.register:=makereg16(hregister);
+          4 : pto^.location.register:=makereg32(hregister);
          else
          else
           internalerror(10064);
           internalerror(10064);
          end;
          end;
+         emit_flag2reg(flags,pto^.location.register);
       end;
       end;
 
 
 
 
@@ -1263,7 +1256,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.60  1999-03-02 18:24:19  peter
+  Revision 1.61  1999-03-05 16:14:20  peter
+    * fixed boolean() typecast
+
+  Revision 1.60  1999/03/02 18:24:19  peter
     * fixed overloading of array of char
     * fixed overloading of array of char
 
 
   Revision 1.59  1999/03/01 15:46:18  peter
   Revision 1.59  1999/03/01 15:46:18  peter