Mercurial > hg > CbC > CbC_gcc
diff gcc/config/h8300/h8300.h @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | f6334be47118 |
children | 84e7813d76e9 |
line wrap: on
line diff
--- a/gcc/config/h8300/h8300.h Sun Aug 21 07:07:55 2011 +0900 +++ b/gcc/config/h8300/h8300.h Fri Oct 27 22:46:09 2017 +0900 @@ -1,8 +1,6 @@ /* Definitions of target machine for GNU compiler. Renesas H8/300 (generic) - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 1992-2017 Free Software Foundation, Inc. Contributed by Steve Chamberlain (sac@cygnus.com), Jim Wilson (wilson@cygnus.com), and Doug Evans (dje@cygnus.com). @@ -41,17 +39,7 @@ #define TARGET_CPU_CPP_BUILTINS() \ do \ { \ - if (TARGET_H8300H) \ - { \ - builtin_define ("__H8300H__"); \ - builtin_assert ("cpu=h8300h"); \ - builtin_assert ("machine=h8300h"); \ - if (TARGET_NORMAL_MODE) \ - { \ - builtin_define ("__NORMAL_MODE__"); \ - } \ - } \ - else if (TARGET_H8300SX) \ + if (TARGET_H8300SX) \ { \ builtin_define ("__H8300SX__"); \ if (TARGET_NORMAL_MODE) \ @@ -69,6 +57,16 @@ builtin_define ("__NORMAL_MODE__"); \ } \ } \ + else if (TARGET_H8300H) \ + { \ + builtin_define ("__H8300H__"); \ + builtin_assert ("cpu=h8300h"); \ + builtin_assert ("machine=h8300h"); \ + if (TARGET_NORMAL_MODE) \ + { \ + builtin_define ("__NORMAL_MODE__"); \ + } \ + } \ else \ { \ builtin_define ("__H8300__"); \ @@ -82,10 +80,6 @@ #define LIB_SPEC "%{mrelax:-relax} %{g:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}" -/* Print subsidiary information on the compiler version in use. */ - -#define TARGET_VERSION fprintf (stderr, " (Renesas H8/300)"); - /* Macros used in the machine description to test the flags. */ /* Select between the H8/300 and H8/300H CPUs. */ @@ -142,7 +136,7 @@ Calls through a register are cheaper than calls to named functions; however, the register pressure this causes makes CSEing of function addresses generally a lose. */ -#define NO_FUNCTION_CSE +#define NO_FUNCTION_CSE 1 /* Target machine storage layout */ @@ -242,23 +236,6 @@ /* r0 r1 r2 r3 r4 r5 r6 r7 mac ap rap fp */ \ { 2, 3, 0, 1, 4, 5, 6, 8, 7, 9, 10, 11 } -#define HARD_REGNO_NREGS(REGNO, MODE) \ - h8300_hard_regno_nregs ((REGNO), (MODE)) - -#define HARD_REGNO_MODE_OK(REGNO, MODE) \ - h8300_hard_regno_mode_ok ((REGNO), (MODE)) - -/* Value is 1 if it is a good idea to tie two pseudo registers - when one has mode MODE1 and one has mode MODE2. - If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2, - for any hard reg, then this must be 0 for correct output. */ -#define MODES_TIEABLE_P(MODE1, MODE2) \ - ((MODE1) == (MODE2) \ - || (((MODE1) == QImode || (MODE1) == HImode \ - || ((TARGET_H8300H || TARGET_H8300S) && (MODE1) == SImode)) \ - && ((MODE2) == QImode || (MODE2) == HImode \ - || ((TARGET_H8300H || TARGET_H8300S) && (MODE2) == SImode)))) - /* A C expression that is nonzero if hard register NEW_REG can be considered for use as a rename register for OLD_REG register */ @@ -330,19 +307,6 @@ { "NO_REGS", "COUNTER_REGS", "SOURCE_REGS", "DESTINATION_REGS", \ "GENERAL_REGS", "MAC_REGS", "ALL_REGS", "LIM_REGS" } -/* The following macro defines cover classes for Integrated Register - Allocator. Cover classes is a set of non-intersected register - classes covering all hard registers used for register allocation - purpose. Any move between two registers of a cover class should be - cheaper than load or store of the registers. The macro value is - array of register classes with LIM_REG_CLASSES used as the end - marker. */ - -#define IRA_COVER_CLASSES \ -{ \ - GENERAL_REGS, MAC_REGS, LIM_REG_CLASSES \ -} - /* Define which registers fit in which classes. This is an initializer for a vector of HARD_REG_SET of length N_REG_CLASSES. */ @@ -374,97 +338,12 @@ #define INDEX_REG_CLASS (TARGET_H8300SX ? GENERAL_REGS : NO_REGS) #define BASE_REG_CLASS GENERAL_REGS -/* Get reg_class from a letter such as appears in the machine description. - - 'a' is the MAC register. */ - -#define REG_CLASS_FROM_LETTER(C) (h8300_reg_class_from_letter (C)) - -/* The letters I, J, K, L, M, N, O, P in a register constraint string - can be used to stand for particular ranges of immediate operands. - This macro defines what the ranges are. - C is the letter, and VALUE is a constant value. - Return 1 if VALUE is in the range specified by C. */ - -#define CONST_OK_FOR_I(VALUE) ((VALUE) == 0) -#define CONST_OK_FOR_J(VALUE) (((VALUE) & 0xff) == 0) -#define CONST_OK_FOR_L(VALUE) \ - (TARGET_H8300H || TARGET_H8300S \ - ? (VALUE) == 1 || (VALUE) == 2 || (VALUE) == 4 \ - : (VALUE) == 1 || (VALUE) == 2) -#define CONST_OK_FOR_M(VALUE) \ - ((VALUE) == 1 || (VALUE) == 2) -#define CONST_OK_FOR_N(VALUE) \ - (TARGET_H8300H || TARGET_H8300S \ - ? (VALUE) == -1 || (VALUE) == -2 || (VALUE) == -4 \ - : (VALUE) == -1 || (VALUE) == -2) -#define CONST_OK_FOR_O(VALUE) \ - ((VALUE) == -1 || (VALUE) == -2) - -/* Multi-letter constraints for constant are always started with P - (just because it was the only letter in the range left. New - constraints for constants should be added here. */ -#define CONST_OK_FOR_Ppositive(VALUE, NBITS) \ - ((VALUE) > 0 && (VALUE) < (1 << (NBITS))) -#define CONST_OK_FOR_Pnegative(VALUE, NBITS) \ - ((VALUE) < 0 && (VALUE) > -(1 << (NBITS))) -#define CONST_OK_FOR_P(VALUE, STR) \ - ((STR)[1] >= '1' && (STR)[1] <= '9' && (STR)[2] == '<' \ - ? (((STR)[3] == '0' || ((STR)[3] == 'X' && TARGET_H8300SX)) \ - && CONST_OK_FOR_Pnegative ((VALUE), (STR)[1] - '0')) \ - : ((STR)[1] >= '1' && (STR)[1] <= '9' && (STR)[2] == '>') \ - ? (((STR)[3] == '0' || ((STR)[3] == 'X' && TARGET_H8300SX)) \ - && CONST_OK_FOR_Ppositive ((VALUE), (STR)[1] - '0')) \ - : 0) -#define CONSTRAINT_LEN_FOR_P(STR) \ - ((((STR)[1] >= '1' && (STR)[1] <= '9') \ - && ((STR)[2] == '<' || (STR)[2] == '>') \ - && ((STR)[3] == 'X' || (STR)[3] == '0')) ? 4 \ - : 0) - -#define CONST_OK_FOR_CONSTRAINT_P(VALUE, C, STR) \ - ((C) == 'P' ? CONST_OK_FOR_P ((VALUE), (STR)) \ - : CONST_OK_FOR_LETTER_P ((VALUE), (C))) - -#define CONST_OK_FOR_LETTER_P(VALUE, C) \ - ((C) == 'I' ? CONST_OK_FOR_I (VALUE) : \ - (C) == 'J' ? CONST_OK_FOR_J (VALUE) : \ - (C) == 'L' ? CONST_OK_FOR_L (VALUE) : \ - (C) == 'M' ? CONST_OK_FOR_M (VALUE) : \ - (C) == 'N' ? CONST_OK_FOR_N (VALUE) : \ - (C) == 'O' ? CONST_OK_FOR_O (VALUE) : \ - 0) - -/* Similar, but for floating constants, and defining letters G and H. - Here VALUE is the CONST_DOUBLE rtx itself. - - `G' is a floating-point zero. */ - -#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ - ((C) == 'G' ? (VALUE) == CONST0_RTX (SFmode) \ - : 0) - -/* Return the maximum number of consecutive registers - needed to represent mode MODE in a register of class CLASS. */ - -/* On the H8, this is the size of MODE in words. */ - -#define CLASS_MAX_NREGS(CLASS, MODE) \ - ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) - -/* Any SI register-to-register move may need to be reloaded, - so define REGISTER_MOVE_COST to be > 2 so that reload never - shortcuts. */ - -#define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \ - (CLASS1 == MAC_REGS || CLASS2 == MAC_REGS ? 6 : 3) - /* Stack layout; function entry, exit and calling. */ /* Define this if pushing a word on the stack makes the stack pointer a smaller address. */ -#define STACK_GROWS_DOWNWARD +#define STACK_GROWS_DOWNWARD 1 /* Define this to nonzero if the nominal address of the stack frame is at the high-address end of the local variables; @@ -473,13 +352,6 @@ #define FRAME_GROWS_DOWNWARD 1 -/* Offset within stack frame to start allocating local variables at. - If FRAME_GROWS_DOWNWARD, this is the offset to the END of the - first local allocated. Otherwise, it is the offset to the BEGINNING - of the first local allocated. */ - -#define STARTING_FRAME_OFFSET 0 - /* If we generate an insn to push BYTES bytes, this says how many the stack pointer really advances by. @@ -527,29 +399,6 @@ #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ ((OFFSET) = h8300_initial_elimination_offset ((FROM), (TO))) -/* Define how to find the value returned by a function. - VALTYPE is the data type of the value (as a tree). - If the precise function being called is known, FUNC is its FUNCTION_DECL; - otherwise, FUNC is 0. - - On the H8 the return value is in R0/R1. */ - -#define FUNCTION_VALUE(VALTYPE, FUNC) \ - gen_rtx_REG (TYPE_MODE (VALTYPE), R0_REG) - -/* Define how to find the value returned by a library function - assuming the value has mode MODE. */ - -/* On the H8 the return value is in R0/R1. */ - -#define LIBCALL_VALUE(MODE) \ - gen_rtx_REG (MODE, R0_REG) - -/* 1 if N is a possible register number for a function value. - On the H8, R0 is the only register thus used. */ - -#define FUNCTION_VALUE_REGNO_P(N) ((N) == R0_REG) - /* Define this if PCC uses the nonreentrant convention for returning structure and union values. */ @@ -580,7 +429,7 @@ struct cum_arg { int nbytes; - struct rtx_def *libcall; + rtx libcall; }; /* Initialize a variable CUM of type CUMULATIVE_ARGS @@ -623,7 +472,8 @@ They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(regno) 0 @@ -645,11 +495,6 @@ && INTVAL (X) < (TARGET_H8300 ? 0x10000 : 0x1000000)) \ || (GET_CODE (X) == HIGH || GET_CODE (X) == CONST)) -/* Nonzero if the constant value X is a legitimate general operand. - It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ - -#define LEGITIMATE_CONSTANT_P(X) (h8300_legitimate_constant_p (X)) - /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx and check its validity for a certain class. We have two alternate definitions for each of them. @@ -685,133 +530,6 @@ #endif -/* Extra constraints. */ - -#define OK_FOR_Q(OP) \ - (TARGET_H8300SX && memory_operand ((OP), VOIDmode)) - -#define OK_FOR_R(OP) \ - (GET_CODE (OP) == CONST_INT \ - ? !h8300_shift_needs_scratch_p (INTVAL (OP), QImode) \ - : 0) - -#define OK_FOR_S(OP) \ - (GET_CODE (OP) == CONST_INT \ - ? !h8300_shift_needs_scratch_p (INTVAL (OP), HImode) \ - : 0) - -#define OK_FOR_T(OP) \ - (GET_CODE (OP) == CONST_INT \ - ? !h8300_shift_needs_scratch_p (INTVAL (OP), SImode) \ - : 0) - -/* 'U' if valid for a bset destination; - i.e. a register, register indirect, or the eightbit memory region - (a SYMBOL_REF with an SYMBOL_REF_FLAG set). - - On the H8S 'U' can also be a 16bit or 32bit absolute. */ -#define OK_FOR_U(OP) \ - ((GET_CODE (OP) == REG && REG_OK_FOR_BASE_P (OP)) \ - || (GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \ - && REG_OK_FOR_BASE_P (XEXP (OP, 0))) \ - || (GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == SYMBOL_REF \ - && TARGET_H8300S) \ - || (GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == CONST \ - && GET_CODE (XEXP (XEXP (OP, 0), 0)) == PLUS \ - && GET_CODE (XEXP (XEXP (XEXP (OP, 0), 0), 0)) == SYMBOL_REF \ - && GET_CODE (XEXP (XEXP (XEXP (OP, 0), 0), 1)) == CONST_INT \ - && (TARGET_H8300S \ - || SYMBOL_REF_FLAG (XEXP (XEXP (XEXP (OP, 0), 0), 0)))) \ - || (GET_CODE (OP) == MEM \ - && h8300_eightbit_constant_address_p (XEXP (OP, 0))) \ - || (GET_CODE (OP) == MEM && (TARGET_H8300S || TARGET_H8300SX) \ - && GET_CODE (XEXP (OP, 0)) == CONST_INT)) - -/* Multi-letter constraints starting with W are to be used for - operands that require a memory operand, i.e,. that are never used - along with register constraints (see EXTRA_MEMORY_CONSTRAINTS). */ - -#define OK_FOR_WU(OP) \ - (GET_CODE (OP) == MEM && OK_FOR_U (OP)) - -#define OK_FOR_W(OP, STR) \ - ((STR)[1] == 'U' ? OK_FOR_WU (OP) \ - : 0) - -#define CONSTRAINT_LEN_FOR_W(STR) \ - ((STR)[1] == 'U' ? 2 \ - : 0) - -/* Multi-letter constraints starting with Y are to be used for operands - that are constant immediates and have single 1 or 0 in their binary - representation. */ - -#define OK_FOR_Y2(OP) \ - ((GET_CODE (OP) == CONST_INT) && (exact_log2 (INTVAL (OP) & 0xff) != -1)) - -#define OK_FOR_Y0(OP) \ - ((GET_CODE (OP) == CONST_INT) && (exact_log2 (~INTVAL (OP) & 0xff) != -1)) - -#define OK_FOR_Y(OP, STR) \ - ((STR)[1] == '2' ? OK_FOR_Y2 (OP) \ - : (STR)[1] == '0' ? OK_FOR_Y0 (OP) \ - : 0) - -#define CONSTRAINT_LEN_FOR_Y(STR) \ - ((STR)[1] == '2' ? 2 \ - : (STR)[1] == '0' ? 2 \ - : 0) - -#define OK_FOR_Z(OP) \ - (TARGET_H8300SX \ - && GET_CODE (OP) == MEM \ - && CONSTANT_P (XEXP ((OP), 0))) - -#define EXTRA_CONSTRAINT_STR(OP, C, STR) \ - ((C) == 'Q' ? OK_FOR_Q (OP) : \ - (C) == 'R' ? OK_FOR_R (OP) : \ - (C) == 'S' ? OK_FOR_S (OP) : \ - (C) == 'T' ? OK_FOR_T (OP) : \ - (C) == 'U' ? OK_FOR_U (OP) : \ - (C) == 'W' ? OK_FOR_W ((OP), (STR)) : \ - (C) == 'Y' ? OK_FOR_Y ((OP), (STR)) : \ - (C) == 'Z' ? OK_FOR_Z (OP) : \ - 0) - -#define CONSTRAINT_LEN(C, STR) \ - ((C) == 'P' ? CONSTRAINT_LEN_FOR_P (STR) \ - : (C) == 'W' ? CONSTRAINT_LEN_FOR_W (STR) \ - : (C) == 'Y' ? CONSTRAINT_LEN_FOR_Y (STR) \ - : DEFAULT_CONSTRAINT_LEN ((C), (STR))) - -/* Experiments suggest that it's better not add 'Q' or 'U' here. No - patterns need it for correctness (no patterns use 'Q' and 'U' - without also providing a register alternative). And defining it - will mean that a spilled pseudo could be replaced by its frame - location in several consecutive insns. - - Instead, it seems to be better to force pseudos to be reloaded - into registers and then use peepholes to recombine insns when - beneficial. - - Unfortunately, for WU (unlike plain U, that matches regs as well), - we must require a memory address. In fact, all multi-letter - constraints started with W are supposed to have this property, so - we just test for W here. */ -#define EXTRA_MEMORY_CONSTRAINT(C, STR) \ - ((C) == 'W') - - -/* Go to LABEL if ADDR (a legitimate address expression) - has an effect that depends on the machine mode it is used for. - - On the H8/300, the predecrement and postincrement address depend thus - (the amount of decrement or increment being the length of the operand). */ - -#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \ - if (GET_CODE (ADDR) == PLUS \ - && h8300_get_index (XEXP (ADDR, 0), VOIDmode, 0) != XEXP (ADDR, 0)) \ - goto LABEL; /* Specify the machine mode that this machine uses for the index in the tablejump instruction. */ @@ -823,10 +541,6 @@ are unsigned. */ #define DEFAULT_SIGNED_CHAR 0 -/* This flag, if defined, says the same insns that convert to a signed fixnum - also convert validly to an unsigned one. */ -#define FIXUNS_TRUNC_LIKE_FIX_TRUNC - /* Max number of bytes we can move from memory to memory in one reasonably fast instruction. */ #define MOVE_MAX (TARGET_H8300H || TARGET_H8300S ? 4 : 2) @@ -840,10 +554,6 @@ of a shift count. */ /* #define SHIFT_COUNT_TRUNCATED */ -/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits - is done just by pretending it is already truncated. */ -#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 - /* Specify the machine mode that pointers have. After generation of rtl, the compiler makes no further distinction between pointers and any other objects of this machine mode. */ @@ -1015,13 +725,6 @@ assemble_name ((FILE), (NAME)), \ fprintf ((FILE), ",%lu\n", (unsigned long)(SIZE))) -/* This says how to output the assembler to define a global - uninitialized but not common symbol. - Try to use asm_output_bss to implement this macro. */ - -#define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ROUNDED) \ - asm_output_bss ((FILE), (DECL), (NAME), (SIZE), (ROUNDED)) - #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) @@ -1035,19 +738,6 @@ #define ASM_PN_FORMAT "%s___%lu" -/* Print an instruction operand X on file FILE. - Look in h8300.c for details. */ - -#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ - ((CODE) == '#') - -#define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE) - -/* Print a memory operand whose address is X, on file FILE. - This uses a function in h8300.c. */ - -#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR) - /* H8300 specific pragmas. */ #define REGISTER_TARGET_PRAGMAS() \ do \