Browse Source

* fixed Florian's quick hack :)
* fixed small bug 64bit range checking code

Jonas Maebe 22 years ago
parent
commit
7a3e1b917c
1 changed files with 26 additions and 6 deletions
  1. 26 6
      compiler/cg64f32.pas

+ 26 - 6
compiler/cg64f32.pas

@@ -506,12 +506,16 @@ unit cg64f32;
         case locpara.loc of
         case locpara.loc of
            LOC_REGISTER:
            LOC_REGISTER:
              tmplochi.register:=tmplochi.registerhigh;
              tmplochi.register:=tmplochi.registerhigh;
+           { !!! i386 doesn't pass proper locations here
+            so always take a loc_reference, since that's what it uses (JM)
            LOC_REFERENCE:
            LOC_REFERENCE:
+           }
+           else
              if target_info.endian=endian_big then
              if target_info.endian=endian_big then
                inc(tmploclo.reference.offset,4)
                inc(tmploclo.reference.offset,4)
              else
              else
                inc(tmplochi.reference.offset,4);
                inc(tmplochi.reference.offset,4);
-           { !!! i386 doesn't pass proper locations here
+           {
            else
            else
              internalerror(2003042702);
              internalerror(2003042702);
            }
            }
@@ -544,12 +548,24 @@ unit cg64f32;
                   inc(tmprefhi.offset,4);
                   inc(tmprefhi.offset,4);
                 tmplochi.register:=tmplochi.registerhigh;
                 tmplochi.register:=tmplochi.registerhigh;
              end;
              end;
+           { !!! i386 doesn't pass proper locations here
+            so always take a loc_reference, since that's what it uses (JM)
            LOC_REFERENCE:
            LOC_REFERENCE:
+           }
+           else
              begin
              begin
-                inc(tmprefhi.offset,4);
-                inc(tmplochi.reference.offset,4);
+                if target_info.endian=endian_big then
+                  begin
+                    inc(tmpreflo.offset,4);
+                    inc(tmploclo.reference.offset,4);
+                  end
+                else
+                  begin
+                    inc(tmprefhi.offset,4);
+                    inc(tmplochi.reference.offset,4);
+                  end;
              end
              end
-           { !!! i386 doesn't pass proper locations here
+           {
            else
            else
              internalerror(2003042701);
              internalerror(2003042701);
            }
            }
@@ -652,7 +668,7 @@ unit cg64f32;
              cg.g_rangecheck(list,p,todef);
              cg.g_rangecheck(list,p,todef);
              hdef.free;
              hdef.free;
              { restore original resulttype.def }
              { restore original resulttype.def }
-             p.resulttype.def := todef;
+             p.resulttype.def := fromdef;
 
 
              if from_signed and to_signed then
              if from_signed and to_signed then
                begin
                begin
@@ -865,7 +881,11 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.42  2003-04-27 09:10:49  florian
+  Revision 1.43  2003-04-27 14:48:09  jonas
+    * fixed Florian's quick hack :)
+    * fixed small bug 64bit range checking code
+
+  Revision 1.42  2003/04/27 09:10:49  florian
     * quick fix for param64 for intel
     * quick fix for param64 for intel
 
 
   Revision 1.41  2003/04/27 08:23:51  florian
   Revision 1.41  2003/04/27 08:23:51  florian