Browse Source

* int64->boolean fixed

peter 24 years ago
parent
commit
7312815d01
2 changed files with 28 additions and 6 deletions
  1. 6 1
      compiler/i386/cga.pas
  2. 22 5
      compiler/i386/n386cnv.pas

+ 6 - 1
compiler/i386/cga.pas

@@ -183,6 +183,8 @@ implementation
          1 : def_opsize:=S_B;
          1 : def_opsize:=S_B;
          2 : def_opsize:=S_W;
          2 : def_opsize:=S_W;
          4 : def_opsize:=S_L;
          4 : def_opsize:=S_L;
+         { I don't know if we need it (FK) }
+         8 : def_opsize:=S_L;
         else
         else
          internalerror(130820001);
          internalerror(130820001);
         end;
         end;
@@ -2983,7 +2985,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.4  2001-08-30 20:13:57  peter
+  Revision 1.5  2001-09-30 21:28:34  peter
+    * int64->boolean fixed
+
+  Revision 1.4  2001/08/30 20:13:57  peter
     * rtti/init table updates
     * rtti/init table updates
     * rttisym for reusable global rtti/init info
     * rttisym for reusable global rtti/init info
     * support published for interfaces
     * support published for interfaces

+ 22 - 5
compiler/i386/n386cnv.pas

@@ -311,6 +311,7 @@ implementation
         hregister : tregister;
         hregister : tregister;
         resflags  : tresflags;
         resflags  : tresflags;
         opsize    : topsize;
         opsize    : topsize;
+        pref      : preference;
       begin
       begin
          clear_location(location);
          clear_location(location);
          { byte(boolean) or word(wordbool) or longint(longbool) must }
          { byte(boolean) or word(wordbool) or longint(longbool) must }
@@ -328,10 +329,23 @@ implementation
          case left.location.loc of
          case left.location.loc of
             LOC_MEM,LOC_REFERENCE :
             LOC_MEM,LOC_REFERENCE :
               begin
               begin
-                hregister:=def_getreg(left.resulttype.def);
-                emit_ref_reg(A_MOV,opsize,
-                  newreference(left.location.reference),hregister);
-                emit_reg_reg(A_OR,opsize,hregister,hregister);
+                if is_64bitint(left.resulttype.def) then
+                 begin
+                   hregister:=getregister32;
+                   emit_ref_reg(A_MOV,opsize,
+                     newreference(left.location.reference),hregister);
+                   pref:=newreference(left.location.reference);
+                   inc(pref^.offset,4);
+                   emit_reg_ref(A_OR,opsize,
+                     hregister,pref);
+                 end
+                else
+                 begin
+                   hregister:=def_getreg(left.resulttype.def);
+                   emit_ref_reg(A_MOV,opsize,
+                     newreference(left.location.reference),hregister);
+                   emit_reg_reg(A_OR,opsize,hregister,hregister);
+                 end;
                 resflags:=F_NE;
                 resflags:=F_NE;
               end;
               end;
             LOC_FLAGS :
             LOC_FLAGS :
@@ -476,7 +490,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.25  2001-09-30 16:12:47  jonas
+  Revision 1.26  2001-09-30 21:28:34  peter
+    * int64->boolean fixed
+
+  Revision 1.25  2001/09/30 16:12:47  jonas
     - removed unnecessary i386 pass_2 of as- and isnode and added dummy generic ones
     - removed unnecessary i386 pass_2 of as- and isnode and added dummy generic ones
 
 
   Revision 1.24  2001/09/29 21:32:47  jonas
   Revision 1.24  2001/09/29 21:32:47  jonas