From 9938169d2c7c6c5995d7f18c3d00ecc8b80c9567 Mon Sep 17 00:00:00 2001
From: Jonas Maebe <jonas@freepascal.org>
Date: Sun, 2 Jun 2013 14:05:07 +0000
Subject: [PATCH]   * don't use the paracgsize in get_paraloc_def(), because it
 generally     contains the tcgsize of the entire parameter rather than only
 of     what is left (-> calculate it from the remaining parameter length)

git-svn-id: trunk@24776 -
---
 compiler/arm/cpupara.pas       |  2 +-
 compiler/avr/cpupara.pas       |  2 +-
 compiler/i386/cpupara.pas      |  2 +-
 compiler/m68k/cpupara.pas      |  2 +-
 compiler/mips/cpupara.pas      |  2 +-
 compiler/paramgr.pas           | 10 +++++-----
 compiler/powerpc/cpupara.pas   |  2 +-
 compiler/powerpc64/cpupara.pas |  2 +-
 8 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/compiler/arm/cpupara.pas b/compiler/arm/cpupara.pas
index 3a4718cdef..8bdc12a55b 100644
--- a/compiler/arm/cpupara.pas
+++ b/compiler/arm/cpupara.pas
@@ -439,7 +439,7 @@ unit cpupara;
                  else
                    begin
                      paraloc^.size:=paracgsize;
-                     paraloc^.def:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
+                     paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
                    end;
                  case loc of
                     LOC_REGISTER:
diff --git a/compiler/avr/cpupara.pas b/compiler/avr/cpupara.pas
index a674684ad8..c4575e6bfc 100644
--- a/compiler/avr/cpupara.pas
+++ b/compiler/avr/cpupara.pas
@@ -366,7 +366,7 @@ unit cpupara;
                             { LOC_REFERENCE covers always the overleft }
                             paraloc^.loc:=LOC_REFERENCE;
                             paraloc^.size:=int_cgsize(paralen);
-                            paraloc^.def:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
+                            paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
 
                             if (side=callerside) then
                               paraloc^.reference.index:=NR_STACK_POINTER_REG;
diff --git a/compiler/i386/cpupara.pas b/compiler/i386/cpupara.pas
index 23c0696f15..c9c1279d12 100644
--- a/compiler/i386/cpupara.pas
+++ b/compiler/i386/cpupara.pas
@@ -531,7 +531,7 @@ unit cpupara;
                         else
                           begin
                             l:=paralen;
-                            paraloc^.def:=get_paraloc_def(paradef,paracgsize,l,firstparaloc);
+                            paraloc^.def:=get_paraloc_def(paradef,l,firstparaloc);
                           end;
                         paraloc^.size:=int_cgsize(l);
                       end;
diff --git a/compiler/m68k/cpupara.pas b/compiler/m68k/cpupara.pas
index 6c2d7f6ffc..233232c081 100644
--- a/compiler/m68k/cpupara.pas
+++ b/compiler/m68k/cpupara.pas
@@ -396,7 +396,7 @@ unit cpupara;
 {$endif DEBUG_CHARLIE}
                     paraloc^.loc:=LOC_REFERENCE;
                     paraloc^.size:=int_cgsize(paralen);
-                    paraloc^.def:=get_paraloc_def(paradef,paraloc^.size,paralen,firstparaloc);
+                    paraloc^.def:=get_paraloc_def(paradef,paralen,firstparaloc);
                     if (side = callerside) then
                       paraloc^.reference.index:=NR_STACK_POINTER_REG
                     else
diff --git a/compiler/mips/cpupara.pas b/compiler/mips/cpupara.pas
index b5ba7014b2..ce5b232965 100644
--- a/compiler/mips/cpupara.pas
+++ b/compiler/mips/cpupara.pas
@@ -463,7 +463,7 @@ implementation
                   begin
                     paraloc^.loc:=LOC_REFERENCE;
                     paraloc^.size:=int_cgsize(paralen);
-                    paraloc^.def:=get_paraloc_def(locdef,paraloc^.size,paralen,firstparaloc);
+                    paraloc^.def:=get_paraloc_def(locdef,paralen,firstparaloc);
 
                     if side=callerside then
                       begin
diff --git a/compiler/paramgr.pas b/compiler/paramgr.pas
index 63adabee29..94d1bbc358 100644
--- a/compiler/paramgr.pas
+++ b/compiler/paramgr.pas
@@ -151,9 +151,9 @@ unit paramgr;
           function handle_common_ret_in_param(def:tdef;pd:tabstractprocdef;out retinparam:boolean):boolean;
 
           { returns the def to use for a tparalocation part of a cgpara for paradef,
-            for which the tcgsize is locsize and the integer length is restlen.
+            for which the def is paradef and the integer length is restlen.
             fullsize is true if restlen equals the full paradef size }
-          function get_paraloc_def(paradef: tdef; paracgsize: tcgsize; restlen: aint; fullsize: boolean): tdef;
+          function get_paraloc_def(paradef: tdef; restlen: aint; fullsize: boolean): tdef;
        end;
 
 
@@ -610,14 +610,14 @@ implementation
       end;
 
 
-    function tparamanager.get_paraloc_def(paradef: tdef; paracgsize: tcgsize; restlen: aint; fullsize: boolean): tdef;
+    function tparamanager.get_paraloc_def(paradef: tdef; restlen: aint; fullsize: boolean): tdef;
       begin
         if fullsize then
           result:=paradef
         { no support for 128 bit ints -> tcgsize2orddef can't handle
           OS_(S)128 }
-        else if not(paracgsize in [OS_NO,OS_128,OS_S128]) then
-          result:=cgsize_orddef(paracgsize)
+        else if restlen in [1,2,4,8] then
+          result:=cgsize_orddef(int_cgsize(paracgsize))
         else
           result:=getarraydef(u8inttype,restlen);
       end;
diff --git a/compiler/powerpc/cpupara.pas b/compiler/powerpc/cpupara.pas
index a5e90ef1e9..c8fdb8da8f 100644
--- a/compiler/powerpc/cpupara.pas
+++ b/compiler/powerpc/cpupara.pas
@@ -480,7 +480,7 @@ unit cpupara;
                       if (paradef.typ<>orddef) then
                         begin
                           paracgsize:=int_cgsize(paralen);
-                          locdef:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
+                          locdef:=get_paraloc_def(paradef,paralen,firstparaloc);
                         end;
                       if (paracgsize in [OS_NO,OS_64,OS_S64,OS_128,OS_S128]) then
                         begin
diff --git a/compiler/powerpc64/cpupara.pas b/compiler/powerpc64/cpupara.pas
index d3240aace4..35f65862eb 100644
--- a/compiler/powerpc64/cpupara.pas
+++ b/compiler/powerpc64/cpupara.pas
@@ -387,7 +387,7 @@ begin
         if (paracgsize <> OS_NO) and (paradef.typ <> orddef) then
           begin
             paracgsize := int_cgsize(paralen);
-            locdef:=get_paraloc_def(paradef,paracgsize,paralen,firstparaloc);
+            locdef:=get_paraloc_def(paradef,paralen,firstparaloc);
           end;
 
         { aix requires that record data (including partial data) stored in