expr.c (emit_group_load): Handle floats.
authorAldy Hernandez <aldyh@redhat.com>
Tue, 26 Oct 2004 10:56:31 +0000 (10:56 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Tue, 26 Oct 2004 10:56:31 +0000 (10:56 +0000)
        * expr.c (emit_group_load): Handle floats.
        (emit_group_store): Same.

From-SVN: r89579

gcc/ChangeLog
gcc/expr.c

index c75df2bafc5351a4e9951f58b35ca6cce4900555..64fe9aba3d4b8a3f42dea6e816c53701cbd17ada 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-26  Aldy Hernandez  <aldyh@redhat.com>
+
+        * expr.c (emit_group_load): Handle floats.
+        (emit_group_store): Same.
+
 2004-10-26  Nathan Sidwell  <nathan@codesourcery.com>
 
        * c-lex.c (get_nonpadding_token): Remove.
index 7ee692ba5442a6ed267ffcf97427df99b2fd0e8d..e71c22f8df305bea1232dafeb9aae6b30e37b680 100644 (file)
@@ -1570,6 +1570,23 @@ emit_group_load (rtx dst, rtx orig_src, tree type ATTRIBUTE_UNUSED, int ssize)
 
   gcc_assert (GET_CODE (dst) == PARALLEL);
 
+  if (!SCALAR_INT_MODE_P (GET_MODE (orig_src)))
+    {
+      enum machine_mode imode = int_mode_for_mode (GET_MODE (orig_src));
+      if (imode == BLKmode)
+       src = assign_stack_temp (GET_MODE (orig_src), ssize, 0);
+      else
+       src = gen_reg_rtx (imode);
+      if (imode != BLKmode)
+       src = gen_lowpart (GET_MODE (orig_src), src);
+      emit_move_insn (src, orig_src);
+      /* ...and back again.  */
+      if (imode != BLKmode)
+       src = gen_lowpart (imode, src);
+      emit_group_load (dst, src, type, ssize);
+      return;
+    }
+
   /* Check for a NULL entry, used to indicate that the parameter goes
      both on the stack and in registers.  */
   if (XEXP (XVECEXP (dst, 0, 0), 0))
@@ -1726,6 +1743,20 @@ emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED, int ssize)
 
   gcc_assert (GET_CODE (src) == PARALLEL);
 
+  if (!SCALAR_INT_MODE_P (GET_MODE (orig_dst)))
+    {
+      enum machine_mode imode = int_mode_for_mode (GET_MODE (orig_dst));
+      if (imode == BLKmode)
+        dst = assign_stack_temp (GET_MODE (orig_dst), ssize, 0);
+      else
+        dst = gen_reg_rtx (imode);
+      emit_group_store (dst, src, type, ssize);
+      if (imode != BLKmode)
+        dst = gen_lowpart (GET_MODE (orig_dst), dst);
+      emit_move_insn (orig_dst, dst);
+      return;
+    }
+
   /* Check for a NULL entry, used to indicate that the parameter goes
      both on the stack and in registers.  */
   if (XEXP (XVECEXP (src, 0, 0), 0))