فهرست منبع

* fixed passing of float in softfloat mode on the stack

git-svn-id: trunk@978 -
florian 20 سال پیش
والد
کامیت
fea7d1df10
1فایلهای تغییر یافته به همراه14 افزوده شده و 4 حذف شده
  1. 14 4
      compiler/arm/cpupara.pas

+ 14 - 4
compiler/arm/cpupara.pas

@@ -289,7 +289,14 @@ unit cpupara;
                  else if paracgsize in [OS_64,OS_S64] then
                  else if paracgsize in [OS_64,OS_S64] then
                    paraloc^.size:=OS_32
                    paraloc^.size:=OS_32
                  else if (loc=LOC_REGISTER) and (paracgsize in [OS_F32,OS_F64,OS_F80]) then
                  else if (loc=LOC_REGISTER) and (paracgsize in [OS_F32,OS_F64,OS_F80]) then
-                   paraloc^.size:=OS_32
+                   case paracgsize of
+                     OS_F32:
+                       paraloc^.size:=OS_32;
+                     OS_F64:
+                       paraloc^.size:=OS_64;
+                     else
+                       internalerror(2005082901);
+                   end
                  else
                  else
                    paraloc^.size:=paracgsize;
                    paraloc^.size:=paracgsize;
                  case loc of
                  case loc of
@@ -304,10 +311,13 @@ unit cpupara;
                           end
                           end
                         else
                         else
                           begin
                           begin
+                            { LOC_REFERENCE covers always the overleft }
                             paraloc^.loc:=LOC_REFERENCE;
                             paraloc^.loc:=LOC_REFERENCE;
-                            paraloc^.reference.index:=NR_STACK_POINTER_REG;
-                            paraloc^.reference.offset:=stack_offset;
-                            inc(stack_offset,4);
+                            paraloc^.size:=int_cgsize(paralen);
+                            if (side=callerside) then
+                              paraloc^.reference.index:=NR_STACK_POINTER_REG;
+                            inc(stack_offset,align(paralen,4));
+                            paralen:=0;
                          end;
                          end;
                       end;
                       end;
                     LOC_FPUREGISTER:
                     LOC_FPUREGISTER: