Procházet zdrojové kódy

* int64 case fixes
* explicit longint type casts for constants used in assembler code
generation s,ice they can be cardinals too (or even int64's in case of
range check errors)

Jonas Maebe před 24 roky
rodič
revize
08f33f6156
1 změnil soubory, kde provedl 20 přidání a 16 odebrání
  1. 20 16
      compiler/i386/n386set.pas

+ 20 - 16
compiler/i386/n386set.pas

@@ -614,7 +614,7 @@ implementation
                     end
                   else
                     begin
-                       emit_const_reg(A_CMP,opsize,t^._low,hregister);
+                       emit_const_reg(A_CMP,opsize,longint(t^._low),hregister);
                        emitjmp(C_Z,t^.statement);
                        last:=t^._low;
                     end;
@@ -639,7 +639,7 @@ implementation
                          end
                        else
                          begin
-                            emit_const_reg(A_CMP,opsize,t^._low,hregister);
+                            emit_const_reg(A_CMP,opsize,longint(t^._low),hregister);
                             emitjmp(jmp_le,elselabel);
                          end;
                     end;
@@ -657,7 +657,7 @@ implementation
                     end
                   else
                     begin
-                       emit_const_reg(A_CMP,opsize,t^._high,hregister);
+                       emit_const_reg(A_CMP,opsize,longint(t^._high),hregister);
                        emitjmp(jmp_lee,t^.statement);
                     end;
 
@@ -698,7 +698,7 @@ implementation
              { need we to test the first value }
              if first and (t^._low>get_min_value(left.resulttype)) then
                begin
-                  emit_const_reg(A_CMP,opsize,t^._low,hregister);
+                  emit_const_reg(A_CMP,opsize,longint(t^._low),hregister);
                   emitjmp(jmp_le,elselabel);
                end;
              if t^._low=t^._high then
@@ -706,7 +706,7 @@ implementation
                   if t^._low-last=0 then
                     emit_reg_reg(A_OR,opsize,hregister,hregister)
                   else
-                    gensub(t^._low-last);
+                    gensub(longint(t^._low-last));
                   last:=t^._low;
                   emitjmp(C_Z,t^.statement);
                end
@@ -718,10 +718,7 @@ implementation
                   if first then
                     begin
                        { have we to ajust the first value ? }
-                       if (with_sign and
-                           (t^._low>get_min_value(left.resulttype))) or
-                          (not with_sign and
-                           (cardinal(t^._low) > cardinal(get_min_value(left.resulttype)))) then
+                       if (t^._low>get_min_value(left.resulttype)) then
                          gensub(t^._low);
                     end
                   else
@@ -732,10 +729,10 @@ implementation
 
                       { note: you can't use gensub() here because dec doesn't }
                       { change the carry flag (needed for jmp_lxx) (JM)       }
-                      emit_const_reg(A_SUB,opsize,t^._low-last,hregister);
+                      emit_const_reg(A_SUB,opsize,longint(t^._low-last),hregister);
                       emitjmp(jmp_le,elselabel);
                     end;
-                  emit_const_reg(A_SUB,opsize,t^._high-t^._low,hregister);
+                  emit_const_reg(A_SUB,opsize,longint(t^._high-t^._low),hregister);
                   emitjmp(jmp_lee,t^.statement);
                   last:=t^._high;
                end;
@@ -785,10 +782,10 @@ implementation
           begin
            if not(jumptable_no_range) then
              begin
-                emit_const_reg(A_CMP,opsize,min_,hregister);
+                emit_const_reg(A_CMP,opsize,longint(min_),hregister);
                 { case expr less than min_ => goto elselabel }
                 emitjmp(jmp_le,elselabel);
-                emit_const_reg(A_CMP,opsize,max_,hregister);
+                emit_const_reg(A_CMP,opsize,longint(max_),hregister);
                 emitjmp(jmp_gt,elselabel);
              end;
            getlabel(table);
@@ -816,7 +813,7 @@ implementation
            new(hr);
            reset_reference(hr^);
            hr^.symbol:=table;
-           hr^.offset:=(-min_)*4;
+           hr^.offset:=(-longint(min_))*4;
            hr^.index:=hregister;
            hr^.scalefactor:=4;
            emit_ref(A_JMP,S_NO,hr);
@@ -834,7 +831,8 @@ implementation
         end;
 
       var
-         lv,hv,max_label,labels : longint;
+         max_label: tconstexprint;
+         lv,hv,labels : longint;
          max_linear_list : longint;
          otl, ofl: pasmlabel;
 {$ifdef Delphi}
@@ -1071,7 +1069,13 @@ begin
 end.
 {
   $Log$
-  Revision 1.8  2000-12-16 15:58:18  jonas
+  Revision 1.9  2000-12-18 17:45:32  jonas
+    * int64 case fixes
+    * explicit longint type casts for constants used in assembler code
+      generation s,ice they can be cardinals too (or even int64's in case of
+      range check errors)
+
+  Revision 1.8  2000/12/16 15:58:18  jonas
     * removed warnings about possible range check errors
 
   Revision 1.7  2000/12/05 11:44:34  jonas