* function.c (assign_parms): When building decl_rtl for
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Feb 2004 08:00:47 +0000 (08:00 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Feb 2004 08:00:47 +0000 (08:00 +0000)
SPLIT_COMPLEX_ARGS, ensure inner modes of concat match outer.

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

gcc/ChangeLog
gcc/function.c

index 4f58b58..93763f2 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-19  Alan Modra  <amodra@bigpond.net.au>
+
+       * function.c (assign_parms): When building decl_rtl for
+       SPLIT_COMPLEX_ARGS, ensure inner modes of concat match outer.
+
 2004-02-19  Olivier Hainque  <hainque@act-europe.fr>
 
        * expr.c (is_aligning_offset): Check if we are aligning the
index bbb9a51..3991ff8 100644 (file)
@@ -5231,15 +5231,27 @@ assign_parms (tree fndecl)
        {
          if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE)
            {
-             rtx tmp;
-
-             SET_DECL_RTL (parm,
-                           gen_rtx_CONCAT (DECL_MODE (parm),
-                                           DECL_RTL (fnargs),
-                                           DECL_RTL (TREE_CHAIN (fnargs))));
-             tmp = gen_rtx_CONCAT (DECL_MODE (parm),
-                                   DECL_INCOMING_RTL (fnargs),
-                                   DECL_INCOMING_RTL (TREE_CHAIN (fnargs)));
+             rtx tmp, real, imag;
+             enum machine_mode inner = GET_MODE_INNER (DECL_MODE (parm));
+
+             real = DECL_RTL (fnargs);
+             imag = DECL_RTL (TREE_CHAIN (fnargs));
+             if (inner != GET_MODE (real))
+               {
+                 real = gen_lowpart_SUBREG (inner, real);
+                 imag = gen_lowpart_SUBREG (inner, imag);
+               }
+             tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
+             SET_DECL_RTL (parm, tmp);
+
+             real = DECL_INCOMING_RTL (fnargs);
+             imag = DECL_INCOMING_RTL (TREE_CHAIN (fnargs));
+             if (inner != GET_MODE (real))
+               {
+                 real = gen_lowpart_SUBREG (inner, real);
+                 imag = gen_lowpart_SUBREG (inner, imag);
+               }
+             tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
              set_decl_incoming_rtl (parm, tmp);
              fnargs = TREE_CHAIN (fnargs);
            }