"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
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. */
#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.
"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")])