Parcourir la source

Merged revisions 2995,2998 via svnmerge from
http://[email protected]/svn/fpc/trunk

................
r2995 | peter | 2006-03-21 07:59:04 +0100 (Tue, 21 Mar 2006) | 10 lines

Merged revisions 2994 via svnmerge from
http://svn.freepascal.org/svn/fpc/branches/linker/compiler

........
r2994 | peter | 2006-03-21 07:58:12 +0100 (Tue, 21 Mar 2006) | 2 lines

* use float size for parameters on the stack

........

................
r2998 | peter | 2006-03-21 09:00:23 +0100 (Tue, 21 Mar 2006) | 10 lines

Merged revisions 2996 via svnmerge from
http://svn.freepascal.org/svn/fpc/branches/linker/compiler

........
r2996 | peter | 2006-03-21 08:50:58 +0100 (Tue, 21 Mar 2006) | 2 lines

* typo in shtype

........

................

git-svn-id: branches/fixes_2_0@3084 -

peter il y a 19 ans
Parent
commit
5f536bbb79
2 fichiers modifiés avec 24 ajouts et 13 suppressions
  1. 18 0
      compiler/cgbase.pas
  2. 6 13
      compiler/x86_64/cpupara.pas

+ 18 - 0
compiler/cgbase.pas

@@ -280,6 +280,7 @@ interface
        size.
     }
     function int_cgsize(const a: aint): tcgsize;{$ifdef USEINLINE}inline;{$endif}
+    function int_float_cgsize(const a: aint): tcgsize;
 
     { return the inverse condition of opcmp }
     function inverse_opcmp(opcmp: topcmp): topcmp;{$ifdef USEINLINE}inline;{$endif}
@@ -519,6 +520,23 @@ implementation
       end;
 
 
+    function int_float_cgsize(const a: aint): tcgsize;
+      begin
+        case a of
+          4 :
+            result:=OS_F32;
+          8 :
+            result:=OS_F64;
+          10 :
+            result:=OS_F80;
+          16 :
+            result:=OS_F128;
+          else
+            internalerror(200603211);
+        end;
+      end;
+
+
     function inverse_opcmp(opcmp: topcmp): topcmp;{$ifdef USEINLINE}inline;{$endif}
       const
         list: array[TOpCmp] of TOpCmp =

+ 6 - 13
compiler/x86_64/cpupara.pas

@@ -405,25 +405,18 @@ unit cpupara;
                         begin
                           paraloc:=hp.paraloc[side].add_location;
                           paraloc^.loc:=LOC_REFERENCE;
-                          { Extended needs a single location }
-                          if (paracgsize=OS_F80) then
-                            begin
-                              paraloc^.size:=paracgsize;
-                              l:=paralen;
-                            end
+                          if paracgsize in [OS_F32,OS_F64,OS_F80,OS_F128] then
+                            paraloc^.size:=int_float_cgsize(paralen)
                           else
-                            begin
-                              l:=paralen;
-                              paraloc^.size:=int_cgsize(l);
-                            end;
+                            paraloc^.size:=int_cgsize(paralen);
                           if side=callerside then
                             paraloc^.reference.index:=NR_STACK_POINTER_REG
                           else
                             paraloc^.reference.index:=NR_FRAME_POINTER_REG;
-                          varalign:=used_align(size_2_align(l),paraalign,paraalign);
+                          varalign:=used_align(size_2_align(paralen),paraalign,paraalign);
                           paraloc^.reference.offset:=parasize;
-                          parasize:=align(parasize+l,varalign);
-                          dec(paralen,l);
+                          parasize:=align(parasize+paralen,varalign);
+                          paralen:=0;
                         end;
                     end;
                     if (locidx<2) and