OSDN Git Service

* config/m68hc11/m68hc11.c (m68hc11_gen_movhi): Use 2,-sp to push
authorciceron <ciceron@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Mar 2004 10:00:30 +0000 (10:00 +0000)
committerciceron <ciceron@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Mar 2004 10:00:30 +0000 (10:00 +0000)
the stack register.
(expand_prologue): Don't make an interrupt or a trap handler a far
symbol.
(m68hc11_initial_elimination_offset): Likewise.

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

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

index 8455840..4509825 100644 (file)
@@ -1,3 +1,11 @@
+2004-03-06  Stephane Carrez  <stcarrez@nerim.fr>
+
+       * config/m68hc11/m68hc11.c (m68hc11_gen_movhi): Use 2,-sp to push
+       the stack register.
+       (expand_prologue): Don't make an interrupt or a trap handler a far
+       symbol.
+       (m68hc11_initial_elimination_offset): Likewise.
+
 2004-03-06  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_in_small_data_p): False for functions.
index cca40ed..9fb9060 100644 (file)
@@ -1402,15 +1402,19 @@ m68hc11_initial_elimination_offset (int from, int to)
   /* For a trap handler, we must take into account the registers which
      are pushed on the stack during the trap (except the PC).  */
   func_attr = TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl));
+  current_function_interrupt = lookup_attribute ("interrupt",
+                                                func_attr) != NULL_TREE;
+  trap_handler = lookup_attribute ("trap", func_attr) != NULL_TREE;
 
   if (lookup_attribute ("far", func_attr) != 0)
     current_function_far = 1;
   else if (lookup_attribute ("near", func_attr) != 0)
     current_function_far = 0;
   else
-    current_function_far = TARGET_LONG_CALLS != 0;
+    current_function_far = (TARGET_LONG_CALLS != 0
+                            && !current_function_interrupt
+                            && !trap_handler);
 
-  trap_handler = lookup_attribute ("trap", func_attr) != NULL_TREE;
   if (trap_handler && from == ARG_POINTER_REGNUM)
     size = 7;
 
@@ -1690,7 +1694,9 @@ expand_prologue (void)
   else if (lookup_attribute ("near", func_attr) != NULL_TREE)
     current_function_far = 0;
   else
-    current_function_far = TARGET_LONG_CALLS != 0;
+    current_function_far = (TARGET_LONG_CALLS != 0
+                            && !current_function_interrupt
+                            && !current_function_trap);
 
   /* Get the scratch register to build the frame and push registers.
      If the first argument is a 32-bit quantity, the D+X registers
@@ -3235,7 +3241,7 @@ m68hc11_gen_movhi (rtx insn, rtx *operands)
              output_asm_insn ("psh%1", operands);
              break;
             case HARD_SP_REGNUM:
-              output_asm_insn ("sts\t-2,sp", operands);
+              output_asm_insn ("sts\t2,-sp", operands);
               break;
            default:
              abort ();