OSDN Git Service

* mn10300/mn10300.c (expand_epilogue): Restore registers in the
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Dec 1996 17:18:18 +0000 (17:18 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Dec 1996 17:18:18 +0000 (17:18 +0000)
        "ret" instruction instead of a separate movm instruction.
        Support possible stack deallocation in "ret" instruction too.
        * mn10300.md (return_internal): Use "ret" instead of "rets";
        restore registers and deallocate stack as needed.
        (load_movm): Delete unused pattern.

        * mn10300/mn10300.h (SMALL_REGISTER_CLASSES): Define.

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

gcc/config/mn10300/mn10300.c
gcc/config/mn10300/mn10300.h
gcc/config/mn10300/mn10300.md

index 9218584..19f57c0 100644 (file)
@@ -244,17 +244,18 @@ expand_epilogue ()
                             frame_pointer_rtx,
                             GEN_INT (-20)));
       emit_move_insn (stack_pointer_rtx, frame_pointer_rtx);
+      size = 0;
+    }
+  else if (size > 255)
+    {
+      emit_insn (gen_addsi3 (stack_pointer_rtx,
+                            stack_pointer_rtx,
+                            GEN_INT (size)));
+      size = 0;
     }
-  else if (size)
-    emit_insn (gen_addsi3 (stack_pointer_rtx,
-                          stack_pointer_rtx,
-                          GEN_INT (size)));
-
-  /* And restore the registers.  */
-  emit_insn (gen_load_movm ());
 
-  /* And return.  */
-  emit_jump_insn (gen_return_internal ());
+  /* Deallocate remaining stack, restore registers and return.  And return.  */
+  emit_jump_insn (gen_return_internal (GEN_INT (size)));
 }
 
 /* Update the condition code from the insn.  */
index b8b416b..d4bce39 100644 (file)
@@ -177,6 +177,9 @@ extern int target_flags;
 #define MODES_TIEABLE_P(MODE1, MODE2) \
   (MODE1 == MODE2 || GET_MODE_SIZE (MODE1) <= 4 && GET_MODE_SIZE (MODE2) <= 4)
 
+/* 4 data, and effectively 3 address registers is small as far as I'm
+   concerned.  */
+#define SMALL_REGISTER_CLASSES 1
 \f
 /* Define the classes of registers for register constraints in the
    machine description.  Also define ranges of constants.
index c330638..443ee99 100644 (file)
   "rets"
   [(set_attr "cc" "clobber")])
 
+;; This insn restores the callee saved registers and does a return, it
+;; can also deallocate stack space.
 (define_insn "return_internal"
   [(const_int 0)
+   (match_operand:SI 0  "const_int_operand" "i")
    (return)]
   ""
-  "rets"
+  "ret [d2,d3,a2,a3],%0"
   [(set_attr "cc" "clobber")])
 
 (define_insn "store_movm"
   ""
   "movm [d2,d3,a2,a3],(sp)"
   [(set_attr "cc" "none")])
-
-(define_insn "load_movm"
-  [(const_int 2)]
-  ""
-  "movm (sp),[d2,d3,a2,a3]"
-  [(set_attr "cc" "none")])