Browse Source

* fix for sparc that pushes floats in int registers

peter 21 years ago
parent
commit
96463e762a
1 changed files with 34 additions and 9 deletions
  1. 34 9
      compiler/ncgcal.pas

+ 34 - 9
compiler/ncgcal.pas

@@ -221,25 +221,42 @@ implementation
            case left.location.loc of
              LOC_MMREGISTER,
              LOC_CMMREGISTER:
-               begin
-                 if tempparaloc.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
+               case tempparaloc.loc of
+                 LOC_REFERENCE,
+                 LOC_CREFERENCE,
+                 LOC_MMREGISTER,
+                 LOC_CMMREGISTER:
+                   cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
+                 LOC_FPUREGISTER,
+                 LOC_CFPUREGISTER:
                    begin
                      location_force_fpureg(exprasmlist,left.location,false);
                      cg.a_paramfpu_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc);
-                   end
+                   end;
                  else
-                   cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
+                   internalerror(2002042433);
                end;
              LOC_FPUREGISTER,
              LOC_CFPUREGISTER:
-               begin
-                 if tempparaloc.loc in [LOC_MMREGISTER,LOC_CMMREGISTER] then
+               case tempparaloc.loc of
+                 LOC_MMREGISTER,
+                 LOC_CMMREGISTER:
                    begin
                      location_force_mmregscalar(exprasmlist,left.location,false);
                      cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
-                   end
-                 else
+                   end;
+{$ifdef sparc}
+                 { sparc pushes floats in normal registers }
+                 LOC_REGISTER,
+                 LOC_CREGISTER,
+{$endif sparc}
+                 LOC_REFERENCE,
+                 LOC_CREFERENCE,
+                 LOC_FPUREGISTER,
+                 LOC_CFPUREGISTER:
                    cg.a_paramfpu_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc);
+                 else
+                   internalerror(2002042433);
                end;
              LOC_REFERENCE,
              LOC_CREFERENCE:
@@ -247,6 +264,11 @@ implementation
                  LOC_MMREGISTER,
                  LOC_CMMREGISTER:
                    cg.a_parammm_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc,mms_movescalar);
+{$ifdef sparc}
+                 { sparc pushes floats in normal registers }
+                 LOC_REGISTER,
+                 LOC_CREGISTER,
+{$endif sparc}
                  LOC_REFERENCE,
                  LOC_CREFERENCE,
                  LOC_FPUREGISTER,
@@ -1242,7 +1264,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.161  2004-03-09 13:04:12  mazen
+  Revision 1.162  2004-03-09 16:28:31  peter
+    * fix for sparc that pushes floats in int registers
+
+  Revision 1.161  2004/03/09 13:04:12  mazen
   + difference between three similar internal errors
 
   Revision 1.160  2004/02/27 10:21:05  florian