* config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Apr 2002 19:52:18 +0000 (19:52 +0000)
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 1 Apr 2002 19:52:18 +0000 (19:52 +0000)
        for which MUST_PASS_IN_STACK is true (e.g., variable-sized types).

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

gcc/ChangeLog
gcc/config/xtensa/xtensa.c

index ba1c60b..fa98fbb 100644 (file)
@@ -1,3 +1,8 @@
+2002-04-01  Bob Wilson  <bob.wilson@acm.org>
+
+       * config/xtensa/xtensa.c (xtensa_va_arg): Fix to handle arguments
+       for which MUST_PASS_IN_STACK is true (e.g., variable-sized types).
+
 2002-04-01  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * c-common.c (unsigned_conversion_warning, convert_and_check,
index 0455737..c6bc959 100644 (file)
@@ -2496,26 +2496,32 @@ xtensa_va_arg (valist, type)
 
   /* Check if the argument is in registers:
 
-     if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4)
+     if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4
+         && !MUST_PASS_IN_STACK (type))
         __array = (AP).__va_reg;
   */
 
-  lab_false = gen_label_rtx ();
-  lab_over = gen_label_rtx ();
   array = gen_reg_rtx (Pmode);
 
-  emit_cmp_and_jump_insns (expand_expr (ndx, NULL_RTX, SImode, EXPAND_NORMAL),
-                          GEN_INT (MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD),
-                          GT, const1_rtx, SImode, 0, lab_false);
+  if (!MUST_PASS_IN_STACK (VOIDmode, type))
+    {
+      lab_false = gen_label_rtx ();
+      lab_over = gen_label_rtx ();
 
-  r = expand_expr (reg, array, Pmode, EXPAND_NORMAL);
-  if (r != array)
-    emit_move_insn (array, r);
+      emit_cmp_and_jump_insns (expand_expr (ndx, NULL_RTX, SImode,
+                                           EXPAND_NORMAL),
+                              GEN_INT (MAX_ARGS_IN_REGISTERS
+                                       * UNITS_PER_WORD),
+                              GT, const1_rtx, SImode, 0, lab_false);
 
-  emit_jump_insn (gen_jump (lab_over));
-  emit_barrier ();
-  emit_label (lab_false);
+      r = expand_expr (reg, array, Pmode, EXPAND_NORMAL);
+      if (r != array)
+       emit_move_insn (array, r);
 
+      emit_jump_insn (gen_jump (lab_over));
+      emit_barrier ();
+      emit_label (lab_false);
+    }
 
   /* ...otherwise, the argument is on the stack (never split between
      registers and the stack -- change __va_ndx if necessary):
@@ -2545,7 +2551,8 @@ xtensa_va_arg (valist, type)
   if (r != array)
     emit_move_insn (array, r);
 
-  emit_label (lab_over);
+  if (!MUST_PASS_IN_STACK (VOIDmode, type))
+    emit_label (lab_over);
 
 
   /* Given the base array pointer (__array) and index to the subsequent