Browse Source

* more fixes for float parameter handling on arm

git-svn-id: trunk@728 -
florian 20 years ago
parent
commit
32b96e75f3
2 changed files with 21 additions and 10 deletions
  1. 17 6
      compiler/cgobj.pas
  2. 4 4
      compiler/ncgcal.pas

+ 17 - 6
compiler/cgobj.pas

@@ -992,15 +992,26 @@ implementation
       var
          ref : treference;
       begin
-         cgpara.check_simple_location;
          case cgpara.location^.loc of
             LOC_FPUREGISTER,LOC_CFPUREGISTER:
-              a_loadfpu_reg_reg(list,size,r,cgpara.location^.register);
+              begin
+                cgpara.check_simple_location;
+                a_loadfpu_reg_reg(list,size,r,cgpara.location^.register);
+              end;
             LOC_REFERENCE,LOC_CREFERENCE:
               begin
-                 reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset);
-                 a_loadfpu_reg_ref(list,size,r,ref);
-              end
+                cgpara.check_simple_location;
+                reference_reset_base(ref,cgpara.location^.reference.index,cgpara.location^.reference.offset);
+                a_loadfpu_reg_ref(list,size,r,ref);
+              end;
+            LOC_REGISTER,LOC_CREGISTER:
+              begin
+                { paramfpu_ref does the check_simpe_location check here if necessary }
+                tg.GetTemp(list,TCGSize2Size[size],tt_normal,ref);
+                a_loadfpu_reg_ref(list,size,r,ref);
+                a_paramfpu_ref(list,size,ref,cgpara);
+                tg.Ungettemp(list,ref);
+              end;
             else
               internalerror(2002071004);
          end;
@@ -1020,7 +1031,7 @@ implementation
               reference_reset_base(href,cgpara.location^.reference.index,cgpara.location^.reference.offset);
               { concatcopy should choose the best way to copy the data }
               g_concatcopy(list,ref,href,tcgsize2size[size]);
-            end
+            end;
           else
             internalerror(200402201);
         end;

+ 4 - 4
compiler/ncgcal.pas

@@ -202,7 +202,7 @@ implementation
                      cg.a_paramfpu_reg(exprasmlist,left.location.size,left.location.register,tempcgpara);
                    end;
                  else
-                   internalerror(2002042433);
+                   internalerror(200204249);
                end;
              LOC_FPUREGISTER,
              LOC_CFPUREGISTER:
@@ -224,8 +224,8 @@ implementation
                      cg.a_param_ref(exprasmlist,left.location.size,left.location.reference,tempcgpara);
                    end;
 {$endif x86_64}
-{$ifdef sparc}
-                 { sparc pushes floats in normal registers }
+{$if defined(sparc) or defined(arm)}
+                 { sparc and arm pass floats in normal registers }
                  LOC_REGISTER,
                  LOC_CREGISTER,
 {$endif sparc}
@@ -254,7 +254,7 @@ implementation
                    end;
 {$endif x86_64}
 {$if defined(sparc) or defined(arm) }
-                 { sparc and arm passes floats in normal registers }
+                 { sparc and arm pass floats in normal registers }
                  LOC_REGISTER,
                  LOC_CREGISTER,
 {$endif sparc}