(SECONDARY_INPUT_RELOAD_CLASS): Require a temporary for a

pic address with a large constant term.

(FUNCTION_PROFILER_LENGTH, FUNCTION_BLOCK_PROFILER_LENGTH,
	BLOCK_PROFILER_LENGTH, REG_PUSH_LENGTH, REG_POP_LENGTH): Added.
	(ADJUST_INSN_LENGTH): Account for profiling code.

From-SVN: r2518
This commit is contained in:
Tom Wood 1992-10-19 21:00:14 +00:00
parent 5785e34c37
commit c9b26f89d1
1 changed files with 51 additions and 9 deletions

View File

@ -215,9 +215,9 @@ extern char * reg_names[];
/* Print subsidiary information on the compiler version in use.
Redefined in m88kv4.h, and m88kluna.h. */
#define VERSION_INFO1 "88open OCS/BCS, "
#define VERSION_INFO2 "10/15/92"
#define VERSION_INFO2 "10/19/92"
#define VERSION_STRING version_string
#define TM_SCCS_ID "@(#)m88k.h 2.2.13.2 10/15/92 08:00:51"
#define TM_SCCS_ID "@(#)m88k.h 2.2.13.4 10/19/92 10:34:58"
/* Run-time compilation parameters selecting different hardware subsets. */
@ -840,6 +840,16 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
#define PREFERRED_RELOAD_CLASS(X,CLASS) \
(CONSTANT_P(X) && (CLASS == XRF_REGS) ? NO_REGS : (CLASS))
/* Return the register class of a scratch register needed to load IN
into a register of class CLASS in MODE. On the m88k, when PIC, we
need a temporary when loading some addresses into a register. */
#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, IN) \
((flag_pic \
&& GET_CODE (IN) == CONST \
&& GET_CODE (XEXP (IN, 0)) == PLUS \
&& GET_CODE (XEXP (XEXP (IN, 0), 0)) == CONST_INT \
&& ! SMALL_INT (XEXP (XEXP (IN, 0), 1))) ? GENERAL_REGS : NO_REGS)
/* Return the maximum number of consecutive registers
needed to represent mode MODE in a register of class CLASS. */
#define CLASS_MAX_NREGS(CLASS, MODE) \
@ -1090,15 +1100,25 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
#define FUNCTION_PROFILER(FILE, LABELNO) \
output_function_profiler (FILE, LABELNO, "mcount", 1)
/* Maximum length in instructions of the code output by FUNCTION_PROFILER. */
#define FUNCTION_PROFILER_LENGTH (5+3+1+5)
/* Output assembler code to FILE to initialize basic-block profiling for
the current module. LABELNO is unique to each instance. */
#define FUNCTION_BLOCK_PROFILER(FILE, LABELNO) \
output_function_block_profiler (FILE, LABELNO)
/* Maximum length in instructions of the code output by
FUNCTION_BLOCK_PROFILER. */
#define FUNCTION_BLOCK_PROFILER_LENGTH (3+5+2+5)
/* Output assembler code to FILE to increment the count associated with
the basic block number BLOCKNO. */
#define BLOCK_PROFILER(FILE, BLOCKNO) output_block_profiler (FILE, BLOCKNO)
/* Maximum length in instructions of the code output by BLOCK_PROFILER. */
#define BLOCK_PROFILER_LENGTH 4
/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
the stack pointer does not matter. The value is tested only in
functions that have frame pointers.
@ -1372,7 +1392,7 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
force_operand (XEXP (X, 1), 0)); \
if (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST \
|| GET_CODE (X) == LABEL_REF) \
(X) = legitimize_address (flag_pic, X, gen_reg_rtx (Pmode)); \
(X) = legitimize_address (flag_pic, X, 0, 0); \
if (memory_address_p (MODE, X)) \
goto WIN; }
@ -1516,18 +1536,34 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
so give the MEM rtx word mode. */
#define FUNCTION_MODE SImode
/* A barrier will be aligned so account for the possible expansion. A
volatile memory reference may be preceeded by a serializing instruction. */
/* A barrier will be aligned so account for the possible expansion.
A volatile load may be preceeded by a serializing instruction.
Account for profiling code output at NOTE_INSN_PROLOGUE_END.
Account for block profiling code at basic block boundaries. */
#define ADJUST_INSN_LENGTH(RTX, LENGTH) \
if (GET_CODE (RTX) == BARRIER \
|| (TARGET_SERIALIZE_VOLATILE \
&& GET_CODE (RTX) == INSN \
&& GET_CODE (PATTERN (RTX)) == SET \
&& ((GET_CODE (SET_SRC (PATTERN (RTX))) == MEM \
&& MEM_VOLATILE_P (SET_SRC (PATTERN (RTX)))) \
|| (GET_CODE (SET_DEST (PATTERN (RTX))) == MEM \
&& MEM_VOLATILE_P (SET_DEST (PATTERN (RTX))))))) \
LENGTH += 1;
&& MEM_VOLATILE_P (SET_SRC (PATTERN (RTX))))))) \
LENGTH += 1; \
else if (GET_CODE (RTX) == NOTE \
&& NOTE_LINE_NUMBER (RTX) == NOTE_INSN_PROLOGUE_END) \
{ \
if (profile_block_flag) \
LENGTH += FUNCTION_BLOCK_PROFILER_LENGTH; \
if (profile_flag) \
LENGTH += (FUNCTION_PROFILER_LENGTH + REG_PUSH_LENGTH \
+ REG_POP_LENGTH); \
} \
else if (profile_block_flag \
&& (GET_CODE (RTX) == CODE_LABEL \
|| GET_CODE (RTX) == JUMP_INSN \
|| (GET_CODE (RTX) == INSN \
&& GET_CODE (PATTERN (RTX)) == SEQUENCE \
&& GET_CODE (XVECEXP (PATTERN (RTX), 0, 0)) == JUMP_INSN)))\
LENGTH += BLOCK_PROFILER_LENGTH;
/* Track the state of the last volatile memory reference. Clear the
state with CC_STATUS_INIT for now. */
@ -2122,6 +2158,9 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
reg_names[REGNO], \
reg_names[STACK_POINTER_REGNUM])
/* Length in instructions of the code output by ASM_OUTPUT_REG_PUSH. */
#define REG_PUSH_LENGTH 2
/* This is how to output an insn to pop a register from the stack. */
#define ASM_OUTPUT_REG_POP(FILE,REGNO) \
fprintf (FILE, "\tld\t %s,%s,0\n\taddu\t %s,%s,%d\n", \
@ -2131,6 +2170,9 @@ enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
reg_names[STACK_POINTER_REGNUM], \
(STACK_BOUNDARY / BITS_PER_UNIT))
/* Length in instructions of the code output by ASM_OUTPUT_REG_POP. */
#define REG_POP_LENGTH 2
/* Define the parentheses used to group arithmetic operations
in assembler code. */
#define ASM_OPEN_PAREN "("