OSDN Git Service

2007-11-27 H.J. Lu <hongjiu.lu@intel.com>
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Nov 2007 01:20:34 +0000 (01:20 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 Nov 2007 01:20:34 +0000 (01:20 +0000)
    Joey Ye <joey.ye@intel.com>

PR target/34001
* config/i386/i386.c (function_arg_32): Don't pass aggregate
arguments in ECX/EDX for fastcall.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130488 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c

index a4c11dd..9262b26 100644 (file)
@@ -1,3 +1,10 @@
+2007-11-27  H.J. Lu  <hongjiu.lu@intel.com>
+           Joey Ye <joey.ye@intel.com>
+
+       PR target/34001
+       * config/i386/i386.c (function_arg_32): Don't pass aggregate
+       arguments in ECX/EDX for fastcall.
+
 2007-11-28  Rask Ingemann Lambertsen  <rask@sygehus.dk>
 
        * config/i386/linux.h (CRT_GET_RFIB_DATA): Add Intel syntax inline
 2007-11-28  Rask Ingemann Lambertsen  <rask@sygehus.dk>
 
        * config/i386/linux.h (CRT_GET_RFIB_DATA): Add Intel syntax inline
index a81ee3d..afed858 100644 (file)
@@ -4253,10 +4253,13 @@ function_arg_32 (CUMULATIVE_ARGS *cum, enum machine_mode mode,
          int regno = cum->regno;
 
          /* Fastcall allocates the first two DWORD (SImode) or
          int regno = cum->regno;
 
          /* Fastcall allocates the first two DWORD (SImode) or
-            smaller arguments to ECX and EDX.  */
+            smaller arguments to ECX and EDX if it isn't an
+            aggregate type .  */
          if (cum->fastcall)
            {
          if (cum->fastcall)
            {
-             if (mode == BLKmode || mode == DImode)
+             if (mode == BLKmode
+                 || mode == DImode
+                 || (type && AGGREGATE_TYPE_P (type)))
                break;
 
              /* ECX not EAX is the first allocated register.  */
                break;
 
              /* ECX not EAX is the first allocated register.  */