i386.c (construct_container): Do not produce BLKmode registers.
authorJan Hubicka <jh@suse.cz>
Mon, 17 May 2004 15:23:12 +0000 (17:23 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 17 May 2004 15:23:12 +0000 (15:23 +0000)
* i386.c (construct_container): Do not produce BLKmode registers.
(classify_argument): Properly compute alignment of complex types.

From-SVN: r81937

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

index 694bb5cda3d5e5c61e509cba11e03cdec045ae31..906b4d5a6a2ce15a8961b4f26339835599268fc7 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-17  Jan Hubicka  <jh@suse.cz>
+
+       * i386.c (construct_container): Do not produce BLKmode registers.
+       (classify_argument): Properly compute alignment of complex types.
+
 2004-05-17  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/15084
index 9e8fdf48d0e4d93067470eb1b4c3afe12d49f910..ad0407d762384df2cdcdf5058e3c58e3f28c21e0 100644 (file)
@@ -2246,6 +2246,8 @@ classify_argument (enum machine_mode mode, tree type,
        mode_alignment = 128;
       else if (mode == XCmode)
        mode_alignment = 256;
+      if (COMPLEX_MODE_P (mode))
+       mode_alignment /= 2;
       /* Misaligned fields are always returned in memory.  */
       if (bit_offset % mode_alignment)
        return 0;
@@ -2423,7 +2425,8 @@ construct_container (enum machine_mode mode, tree type, int in_return,
       default:
        abort ();
       }
-  if (n == 2 && class[0] == X86_64_SSE_CLASS && class[1] == X86_64_SSEUP_CLASS)
+  if (n == 2 && class[0] == X86_64_SSE_CLASS && class[1] == X86_64_SSEUP_CLASS
+      && mode != BLKmode)
     return gen_rtx_REG (mode, SSE_REGNO (sse_regno));
   if (n == 2
       && class[0] == X86_64_X87_CLASS && class[1] == X86_64_X87UP_CLASS)
@@ -2435,7 +2438,8 @@ construct_container (enum machine_mode mode, tree type, int in_return,
     return gen_rtx_REG (mode, intreg[0]);
   if (n == 4
       && class[0] == X86_64_X87_CLASS && class[1] == X86_64_X87UP_CLASS
-      && class[2] == X86_64_X87_CLASS && class[3] == X86_64_X87UP_CLASS)
+      && class[2] == X86_64_X87_CLASS && class[3] == X86_64_X87UP_CLASS
+      && mode != BLKmode)
     return gen_rtx_REG (XCmode, FIRST_STACK_REG);
 
   /* Otherwise figure out the entries of the PARALLEL.  */