Commit 4d1a91c2 by Jeff Law

mn10300.h (REG_CLASS_FROM_LETTER): Map 'y' to SP_REGS.

        * mn10300.h (REG_CLASS_FROM_LETTER): Map 'y' to SP_REGS.
        Handle 'x' as NO_REGS for this cpu.
        (REGNO_OK_FOR_BIT_BASE_P): Define.
        (REG_OK_FOR_BIT_BASE_P): Define.
        (GO_IF_LEGITIMATE_ADDRESS): Use them.
        (REG_OK_FOR_INDEX_P): Tweak.
        * mn13000.c (REG_SAVE_BYTES): Define.
        (expand_epilogue, initial_offset): Use it.
        (secondary_reload_class): Slightly reformat.
        (output_tst): Tweak comments.
        * mn10300.md: Change 'x' to 'y' for SP_REGS.  Then add 'x' to many
        patterns.
        (addsi3): Turn into a define_expand/define_insn pair.  Rework code for
        three operand addition case to be more efficient.
        (subsi3): Turn into a define_expand/define_insn pair.

From-SVN: r21104
parent 518b6ce3
......@@ -36,6 +36,11 @@ Boston, MA 02111-1307, USA. */
#include "tree.h"
#include "obstack.h"
/* The size of the callee register save area. Right now we save everything
on entry since it costs us nothing in code size. It does cost us from a
speed standpoint, so we want to optimize this sooner or later. */
#define REG_SAVE_BYTES (16)
/* Global registers known to hold the value zero.
Normally we'd depend on CSE and combine to put zero into a
......@@ -439,8 +444,8 @@ expand_prologue ()
/* Determine if it is profitable to put the value zero into a register
for the entire function. If so, set ZERO_DREG and ZERO_AREG. */
if (regs_ever_live[2] || regs_ever_live[3]
|| regs_ever_live[6] || regs_ever_live[7]
|| frame_pointer_needed)
|| regs_ever_live[6] || regs_ever_live[7]
|| frame_pointer_needed)
{
int dreg_count, areg_count;
......@@ -569,7 +574,7 @@ expand_epilogue ()
}
else if ((regs_ever_live[2] || regs_ever_live[3]
|| regs_ever_live[6] || regs_ever_live[7])
&& size + 16 > 255)
&& size + REG_SAVE_BYTES > 255)
{
emit_insn (gen_addsi3 (stack_pointer_rtx,
stack_pointer_rtx,
......@@ -585,7 +590,7 @@ expand_epilogue ()
if (regs_ever_live[2] || regs_ever_live[3]
|| regs_ever_live[6] || regs_ever_live[7]
|| frame_pointer_needed)
emit_jump_insn (gen_return_internal_regs (GEN_INT (size + 16)));
emit_jump_insn (gen_return_internal_regs (GEN_INT (size + REG_SAVE_BYTES)));
else
{
if (size)
......@@ -689,7 +694,9 @@ secondary_reload_class (class, mode, in)
if (GET_CODE (in) == MEM
&& (mode == QImode || mode == HImode)
&& (class == ADDRESS_REGS || class == SP_REGS))
return DATA_REGS;
{
return DATA_REGS;
}
/* We can't directly load sp + const_int into a data register;
we must use an address register as an intermediate. */
......@@ -705,9 +712,10 @@ secondary_reload_class (class, mode, in)
if (GET_CODE (in) == PLUS
&& (XEXP (in, 0) == stack_pointer_rtx
|| XEXP (in, 1) == stack_pointer_rtx))
return DATA_REGS;
{
return DATA_REGS;
}
/* Otherwise assume no secondary reloads are needed. */
return NO_REGS;
}
......@@ -723,7 +731,7 @@ initial_offset (from, to)
if (regs_ever_live[2] || regs_ever_live[3]
|| regs_ever_live[6] || regs_ever_live[7]
|| frame_pointer_needed)
return 16;
return REG_SAVE_BYTES;
else
return 0;
}
......@@ -736,7 +744,7 @@ initial_offset (from, to)
if (regs_ever_live[2] || regs_ever_live[3]
|| regs_ever_live[6] || regs_ever_live[7]
|| frame_pointer_needed)
return (get_frame_size () + 16
return (get_frame_size () + REG_SAVE_BYTES
+ (current_function_outgoing_args_size
? current_function_outgoing_args_size + 4 : 0));
else
......@@ -950,7 +958,10 @@ output_tst (operand, insn)
If it's a call clobbered register, have we past a call?
Make sure the register we find isn't the same as ourself;
the mn10300 can't encode that. */
the mn10300 can't encode that.
??? reg_set_between_p return nonzero anytime we pass a CALL_INSN
so the code to detect calls here isn't doing anything useful. */
if (REG_P (SET_DEST (set))
&& SET_SRC (set) == CONST0_RTX (GET_MODE (SET_DEST (set)))
&& !reg_set_between_p (SET_DEST (set), temp, insn)
......
/* Definitions of target machine for GNU compiler. Matsushita MN10300 series
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Jeff Law (law@cygnus.com).
This file is part of GNU CC.
......@@ -209,7 +209,9 @@ extern struct rtx_def *zero_areg;
class that represents their union. */
enum reg_class {
NO_REGS, DATA_REGS, ADDRESS_REGS, SP_REGS, DATA_OR_ADDRESS_REGS, SP_OR_ADDRESS_REGS, GENERAL_REGS, ALL_REGS, LIM_REG_CLASSES
NO_REGS, DATA_REGS, ADDRESS_REGS, SP_REGS,
DATA_OR_ADDRESS_REGS, SP_OR_ADDRESS_REGS,
GENERAL_REGS, ALL_REGS, LIM_REG_CLASSES
};
#define N_REG_CLASSES (int) LIM_REG_CLASSES
......@@ -244,10 +246,9 @@ enum reg_class {
#define REGNO_REG_CLASS(REGNO) \
((REGNO) < 4 ? DATA_REGS : \
(REGNO) < 9 ? ADDRESS_REGS : \
(REGNO) == 9 ? SP_REGS: 0)
(REGNO) == 9 ? SP_REGS : 0)
/* The class value for index registers, and the one for base regs. */
#define INDEX_REG_CLASS DATA_REGS
#define BASE_REG_CLASS SP_OR_ADDRESS_REGS
......@@ -256,7 +257,7 @@ enum reg_class {
#define REG_CLASS_FROM_LETTER(C) \
((C) == 'd' ? DATA_REGS : \
(C) == 'a' ? ADDRESS_REGS : \
(C) == 'x' ? SP_REGS : NO_REGS)
(C) == 'y' ? SP_REGS : NO_REGS)
/* Macros to check register numbers against specific register classes. */
......@@ -270,6 +271,10 @@ enum reg_class {
(((regno) > 3 && regno < FIRST_PSEUDO_REGISTER) \
|| (reg_renumber[regno] > 3 && reg_renumber[regno] < FIRST_PSEUDO_REGISTER))
#define REGNO_OK_FOR_BIT_BASE_P(regno) \
(((regno) > 3 && regno < 10) \
|| (reg_renumber[regno] > 3 && reg_renumber[regno] < 10))
#define REGNO_OK_FOR_INDEX_P(regno) \
(((regno) >= 0 && regno < 4) \
|| (reg_renumber[regno] >= 0 && reg_renumber[regno] < 4))
......@@ -585,11 +590,11 @@ extern struct rtx_def *mn10300_builtin_saveregs ();
&& GET_MODE (OP) == QImode \
&& (CONSTANT_ADDRESS_P (XEXP (OP, 0)) \
|| (GET_CODE (XEXP (OP, 0)) == REG \
&& REG_OK_FOR_BASE_P (XEXP (OP, 0)) \
&& REG_OK_FOR_BIT_BASE_P (XEXP (OP, 0)) \
&& XEXP (OP, 0) != stack_pointer_rtx) \
|| (GET_CODE (XEXP (OP, 0)) == PLUS \
&& GET_CODE (XEXP (XEXP (OP, 0), 0)) == REG \
&& REG_OK_FOR_BASE_P (XEXP (XEXP (OP, 0), 0)) \
&& REG_OK_FOR_BIT_BASE_P (XEXP (XEXP (OP, 0), 0)) \
&& XEXP (XEXP (OP, 0), 0) != stack_pointer_rtx \
&& GET_CODE (XEXP (XEXP (OP, 0), 1)) == CONST_INT \
&& INT_8_BITS (INTVAL (XEXP (XEXP (OP, 0), 1))))))
......@@ -618,16 +623,20 @@ extern struct rtx_def *mn10300_builtin_saveregs ();
/* Nonzero if X is a hard reg that can be used as an index
or if it is a pseudo reg. */
#define REG_OK_FOR_INDEX_P(X) \
((REGNO (X) >= 0 && REGNO(X) <= 3) || REGNO (X) >= FIRST_PSEUDO_REGISTER)
((REGNO (X) >= 0 && REGNO(X) <= 3) || REGNO (X) >= 10)
/* Nonzero if X is a hard reg that can be used as a base reg
or if it is a pseudo reg. */
#define REG_OK_FOR_BASE_P(X) \
((REGNO (X) >= 4 && REGNO(X) <= 9) || REGNO (X) >= FIRST_PSEUDO_REGISTER)
((REGNO (X) >= 4 && REGNO(X) <= 9) || REGNO (X) >= 10)
#define REG_OK_FOR_BIT_BASE_P(X) \
((REGNO (X) >= 4 && REGNO(X) <= 9))
#else
/* Nonzero if X is a hard reg that can be used as an index. */
#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
/* Nonzero if X is a hard reg that can be used as a base reg. */
#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
/* Nonzero if X is a hard reg that can be used as a base reg. */
#define REG_OK_FOR_BIT_BASE_P(X) REGNO_OK_FOR_BIT_BASE_P (REGNO (X))
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment