m68hc11.c (expand_prologue): For an interrupt handler save the soft registers after...
authorStephane Carrez <stcarrez@nerim.fr>
Mon, 31 Mar 2003 20:28:40 +0000 (22:28 +0200)
committerStephane Carrez <ciceron@gcc.gnu.org>
Mon, 31 Mar 2003 20:28:40 +0000 (22:28 +0200)
* config/m68hc11/m68hc11.c (expand_prologue): For an interrupt handler
save the soft registers after the frame pointer so that gdb can unwind
the frame more easily.
(expand_epilogue): Likewise in opposite order; allow to use X register
as scratch if the return value is by reference.

From-SVN: r65104

gcc/ChangeLog
gcc/config/m68hc11/m68hc11.c

index 545b048b9331a38e31f31b06231f0f7933b16488..57283ce89ce12fd91b963fd7679eacbd40a9762e 100644 (file)
@@ -1,3 +1,11 @@
+2003-03-31  Stephane Carrez  <stcarrez@nerim.fr>
+
+       * config/m68hc11/m68hc11.c (expand_prologue): For an interrupt handler
+       save the soft registers after the frame pointer so that gdb can unwind
+       the frame more easily.
+       (expand_epilogue): Likewise in opposite order; allow to use X register
+       as scratch if the return value is by reference.
+
 2003-03-31  Jason Merrill  <jason@redhat.com>
 
        PR java/10145
index 97d43d304b677ac80bf9f0448b61fa42ec45b2bc..0e8f36495b2dfc67b963cd62616180d50f5f09f4 100644 (file)
@@ -1683,6 +1683,10 @@ expand_prologue ()
   else
     scratch = ix_reg;
 
+  /* Save current stack frame.  */
+  if (frame_pointer_needed)
+    emit_move_after_reload (stack_push_word, hard_frame_pointer_rtx, scratch);
+
   /* For an interrupt handler, we must preserve _.tmp, _.z and _.xy.
      Other soft registers in page0 need not to be saved because they
      will be restored by C functions.  For a trap handler, we don't
@@ -1697,10 +1701,6 @@ expand_prologue ()
                              scratch);
     }
 
-  /* Save current stack frame.  */
-  if (frame_pointer_needed)
-    emit_move_after_reload (stack_push_word, hard_frame_pointer_rtx, scratch);
-
   /* Allocate local variables.  */
   if (TARGET_M6812 && (size > 4 || size == 3))
     {
@@ -1774,7 +1774,7 @@ expand_epilogue ()
   else
     return_size = GET_MODE_SIZE (GET_MODE (current_function_return_rtx));
 
-  if (return_size > HARD_REG_SIZE)
+  if (return_size > HARD_REG_SIZE && return_size <= 2 * HARD_REG_SIZE)
     scratch = iy_reg;
   else
     scratch = ix_reg;
@@ -1821,10 +1821,6 @@ expand_epilogue ()
                               stack_pointer_rtx, GEN_INT (1)));
     }
 
-  /* Restore previous frame pointer.  */
-  if (frame_pointer_needed)
-    emit_move_after_reload (hard_frame_pointer_rtx, stack_pop_word, scratch);
-
   /* For an interrupt handler, restore ZTMP, ZREG and XYREG.  */
   if (current_function_interrupt)
     {
@@ -1835,6 +1831,10 @@ expand_epilogue ()
       emit_move_after_reload (m68hc11_soft_tmp_reg, stack_pop_word, scratch);
     }
 
+  /* Restore previous frame pointer.  */
+  if (frame_pointer_needed)
+    emit_move_after_reload (hard_frame_pointer_rtx, stack_pop_word, scratch);
+
   /* If the trap handler returns some value, copy the value
      in D, X onto the stack so that the rti will pop the return value
      correctly.  */