| Index: gcc/gcc/config/bfin/bfin.h
|
| diff --git a/gcc/gcc/config/bfin/bfin.h b/gcc/gcc/config/bfin/bfin.h
|
| index 8193ff3a7474947c88148926c3ffb9506d7c50c9..365680ee9fa095c5a6a927b05963ce09ea3ee947 100644
|
| --- a/gcc/gcc/config/bfin/bfin.h
|
| +++ b/gcc/gcc/config/bfin/bfin.h
|
| @@ -1,5 +1,5 @@
|
| /* Definitions for the Blackfin port.
|
| - Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
|
| + Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
|
| Contributed by Analog Devices.
|
|
|
| This file is part of GCC.
|
| @@ -26,6 +26,49 @@
|
| #define BRT 1
|
| #define BRF 0
|
|
|
| +/* CPU type. */
|
| +typedef enum bfin_cpu_type
|
| +{
|
| + BFIN_CPU_UNKNOWN,
|
| + BFIN_CPU_BF512,
|
| + BFIN_CPU_BF514,
|
| + BFIN_CPU_BF516,
|
| + BFIN_CPU_BF518,
|
| + BFIN_CPU_BF522,
|
| + BFIN_CPU_BF523,
|
| + BFIN_CPU_BF524,
|
| + BFIN_CPU_BF525,
|
| + BFIN_CPU_BF526,
|
| + BFIN_CPU_BF527,
|
| + BFIN_CPU_BF531,
|
| + BFIN_CPU_BF532,
|
| + BFIN_CPU_BF533,
|
| + BFIN_CPU_BF534,
|
| + BFIN_CPU_BF536,
|
| + BFIN_CPU_BF537,
|
| + BFIN_CPU_BF538,
|
| + BFIN_CPU_BF539,
|
| + BFIN_CPU_BF542,
|
| + BFIN_CPU_BF542M,
|
| + BFIN_CPU_BF544,
|
| + BFIN_CPU_BF544M,
|
| + BFIN_CPU_BF547,
|
| + BFIN_CPU_BF547M,
|
| + BFIN_CPU_BF548,
|
| + BFIN_CPU_BF548M,
|
| + BFIN_CPU_BF549,
|
| + BFIN_CPU_BF549M,
|
| + BFIN_CPU_BF561
|
| +} bfin_cpu_t;
|
| +
|
| +/* Value of -mcpu= */
|
| +extern bfin_cpu_t bfin_cpu_type;
|
| +
|
| +/* Value of -msi-revision= */
|
| +extern int bfin_si_revision;
|
| +
|
| +extern unsigned int bfin_workarounds;
|
| +
|
| /* Print subsidiary information on the compiler version in use. */
|
| #define TARGET_VERSION fprintf (stderr, " (BlackFin bfin)")
|
|
|
| @@ -109,22 +152,32 @@ extern int target_flags;
|
| case BFIN_CPU_BF539: \
|
| builtin_define ("__ADSPBF539__"); \
|
| break; \
|
| + case BFIN_CPU_BF542M: \
|
| + builtin_define ("__ADSPBF542M__"); \
|
| case BFIN_CPU_BF542: \
|
| builtin_define ("__ADSPBF542__"); \
|
| builtin_define ("__ADSPBF54x__"); \
|
| break; \
|
| + case BFIN_CPU_BF544M: \
|
| + builtin_define ("__ADSPBF544M__"); \
|
| case BFIN_CPU_BF544: \
|
| builtin_define ("__ADSPBF544__"); \
|
| builtin_define ("__ADSPBF54x__"); \
|
| break; \
|
| - case BFIN_CPU_BF548: \
|
| - builtin_define ("__ADSPBF548__"); \
|
| - builtin_define ("__ADSPBF54x__"); \
|
| - break; \
|
| + case BFIN_CPU_BF547M: \
|
| + builtin_define ("__ADSPBF547M__"); \
|
| case BFIN_CPU_BF547: \
|
| builtin_define ("__ADSPBF547__"); \
|
| builtin_define ("__ADSPBF54x__"); \
|
| break; \
|
| + case BFIN_CPU_BF548M: \
|
| + builtin_define ("__ADSPBF548M__"); \
|
| + case BFIN_CPU_BF548: \
|
| + builtin_define ("__ADSPBF548__"); \
|
| + builtin_define ("__ADSPBF54x__"); \
|
| + break; \
|
| + case BFIN_CPU_BF549M: \
|
| + builtin_define ("__ADSPBF549M__"); \
|
| case BFIN_CPU_BF549: \
|
| builtin_define ("__ADSPBF549__"); \
|
| builtin_define ("__ADSPBF54x__"); \
|
| @@ -313,13 +366,6 @@ extern const char *bfin_library_id_string;
|
| found in the variable crtl->outgoing_args_size. */
|
| #define ACCUMULATE_OUTGOING_ARGS 1
|
|
|
| -/* Value should be nonzero if functions must have frame pointers.
|
| - Zero means the frame pointer need not be set up (and parms
|
| - may be accessed via the stack pointer) in functions that seem suitable.
|
| - This is computed in `reload', in reload1.c.
|
| -*/
|
| -#define FRAME_POINTER_REQUIRED (bfin_frame_pointer_required ())
|
| -
|
| /*#define DATA_ALIGNMENT(TYPE, BASIC-ALIGN) for arrays.. */
|
|
|
| /* If defined, a C expression to compute the alignment for a local
|
| @@ -340,30 +386,6 @@ extern const char *bfin_library_id_string;
|
| && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
|
|
|
| #define TRAMPOLINE_SIZE (TARGET_FDPIC ? 30 : 18)
|
| -#define TRAMPOLINE_TEMPLATE(FILE) \
|
| - if (TARGET_FDPIC) \
|
| - { \
|
| - fprintf(FILE, "\t.dd\t0x00000000\n"); /* 0 */ \
|
| - fprintf(FILE, "\t.dd\t0x00000000\n"); /* 0 */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e109\n"); /* p1.l = fn low */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e149\n"); /* p1.h = fn high */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e10a\n"); /* p2.l = sc low */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e14a\n"); /* p2.h = sc high */ \
|
| - fprintf(FILE, "\t.dw\t0xac4b\n"); /* p3 = [p1 + 4] */ \
|
| - fprintf(FILE, "\t.dw\t0x9149\n"); /* p1 = [p1] */ \
|
| - fprintf(FILE, "\t.dw\t0x0051\n"); /* jump (p1)*/ \
|
| - } \
|
| - else \
|
| - { \
|
| - fprintf(FILE, "\t.dd\t0x0000e109\n"); /* p1.l = fn low */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e149\n"); /* p1.h = fn high */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e10a\n"); /* p2.l = sc low */ \
|
| - fprintf(FILE, "\t.dd\t0x0000e14a\n"); /* p2.h = sc high */ \
|
| - fprintf(FILE, "\t.dw\t0x0051\n"); /* jump (p1)*/ \
|
| - }
|
| -
|
| -#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
| - initialize_trampoline (TRAMP, FNADDR, CXT)
|
|
|
| /* Definitions for register eliminations.
|
|
|
| @@ -383,14 +405,6 @@ extern const char *bfin_library_id_string;
|
| { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
|
| { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} \
|
|
|
| -/* Given FROM and TO register numbers, say whether this elimination is
|
| - allowed. Frame pointer elimination is automatically handled.
|
| -
|
| - All other eliminations are valid. */
|
| -
|
| -#define CAN_ELIMINATE(FROM, TO) \
|
| - ((TO) == STACK_POINTER_REGNUM ? ! frame_pointer_needed : 1)
|
| -
|
| /* Define the offset between two registers, one to be eliminated, and the other
|
| its replacement, at the start of a routine. */
|
|
|
| @@ -809,6 +823,7 @@ enum reg_class
|
| typedef enum {
|
| SUBROUTINE, INTERRUPT_HANDLER, EXCPT_HANDLER, NMI_HANDLER
|
| } e_funkind;
|
| +#define FUNCTION_RETURN_REGISTERS { REG_RETS, REG_RETI, REG_RETX, REG_RETN }
|
|
|
| #define FUNCTION_ARG_REGISTERS { REG_R0, REG_R1, REG_R2, -1 }
|
|
|
| @@ -896,9 +911,6 @@ typedef struct {
|
|
|
| /* Addressing Modes */
|
|
|
| -/* Recognize any constant value that is a valid address. */
|
| -#define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X))
|
| -
|
| /* Nonzero if the constant value X is a legitimate general operand.
|
| symbol_ref are not legitimate and will be put into constant pool.
|
| See force_const_mem().
|
| @@ -908,65 +920,13 @@ typedef struct {
|
|
|
| /* A number, the maximum number of registers that can appear in a
|
| valid memory address. Note that it is up to you to specify a
|
| - value equal to the maximum number that `GO_IF_LEGITIMATE_ADDRESS'
|
| + value equal to the maximum number that `TARGET_LEGITIMATE_ADDRESS_P'
|
| would ever accept. */
|
| #define MAX_REGS_PER_ADDRESS 1
|
|
|
| -/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
|
| - that is a valid memory address for an instruction.
|
| - The MODE argument is the machine mode for the MEM expression
|
| - that wants to use this address.
|
| -
|
| - Blackfin addressing modes are as follows:
|
| -
|
| - [preg]
|
| - [preg + imm16]
|
| -
|
| - B [ Preg + uimm15 ]
|
| - W [ Preg + uimm16m2 ]
|
| - [ Preg + uimm17m4 ]
|
| -
|
| - [preg++]
|
| - [preg--]
|
| - [--sp]
|
| -*/
|
| -
|
| #define LEGITIMATE_MODE_FOR_AUTOINC_P(MODE) \
|
| (GET_MODE_SIZE (MODE) <= 4 || (MODE) == PDImode)
|
|
|
| -#ifdef REG_OK_STRICT
|
| -#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
|
| - do { \
|
| - if (bfin_legitimate_address_p (MODE, X, 1)) \
|
| - goto WIN; \
|
| - } while (0);
|
| -#else
|
| -#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
|
| - do { \
|
| - if (bfin_legitimate_address_p (MODE, X, 0)) \
|
| - goto WIN; \
|
| - } while (0);
|
| -#endif
|
| -
|
| -/* Try machine-dependent ways of modifying an illegitimate address
|
| - to be legitimate. If we find one, return the new, valid address.
|
| - This macro is used in only one place: `memory_address' in explow.c.
|
| -
|
| - OLDX is the address as it was before break_out_memory_refs was called.
|
| - In some cases it is useful to look at this to decide what needs to be done.
|
| -
|
| - MODE and WIN are passed so that this macro can use
|
| - GO_IF_LEGITIMATE_ADDRESS.
|
| -
|
| - It is always safe for this macro to do nothing. It exists to recognize
|
| - opportunities to optimize the output.
|
| - */
|
| -#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
|
| -do { \
|
| - rtx _q = legitimize_address(X, OLDX, MODE); \
|
| - if (_q) { X = _q; goto WIN; } \
|
| -} while (0)
|
| -
|
| #define HAVE_POST_INCREMENT 1
|
| #define HAVE_POST_DECREMENT 1
|
| #define HAVE_PRE_DECREMENT 1
|
| @@ -986,23 +946,6 @@ do { \
|
| || GET_CODE (X) == LABEL_REF \
|
| || (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))
|
|
|
| -/*
|
| - A C statement or compound statement with a conditional `goto
|
| - LABEL;' executed if memory address X (an RTX) can have different
|
| - meanings depending on the machine mode of the memory reference it
|
| - is used for or if the address is valid for some modes but not
|
| - others.
|
| -
|
| - Autoincrement and autodecrement addresses typically have
|
| - mode-dependent effects because the amount of the increment or
|
| - decrement is the size of the operand being addressed. Some
|
| - machines have other mode-dependent addresses. Many RISC machines
|
| - have no mode-dependent addresses.
|
| -
|
| - You may assume that ADDR is a valid address for the machine.
|
| -*/
|
| -#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
|
| -
|
| #define NOTICE_UPDATE_CC(EXPR, INSN) 0
|
|
|
| /* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
|
| @@ -1328,7 +1271,6 @@ do { \
|
| #define ASM_OUTPUT_REG_PUSH(FILE, REGNO) fprintf (FILE, "[SP--] = %s;\n", reg_names[REGNO])
|
| #define ASM_OUTPUT_REG_POP(FILE, REGNO) fprintf (FILE, "%s = [SP++];\n", reg_names[REGNO])
|
|
|
| -extern struct rtx_def *bfin_compare_op0, *bfin_compare_op1;
|
| extern struct rtx_def *bfin_cc_rtx, *bfin_rets_rtx;
|
|
|
| /* This works for GAS and some other assemblers. */
|
| @@ -1339,8 +1281,12 @@ extern struct rtx_def *bfin_cc_rtx, *bfin_rets_rtx;
|
|
|
| #define SIZE_ASM_OP "\t.size\t"
|
|
|
| -extern int splitting_for_sched;
|
| +extern int splitting_for_sched, splitting_loops;
|
|
|
| #define PRINT_OPERAND_PUNCT_VALID_P(CHAR) ((CHAR) == '!')
|
|
|
| +#ifndef TARGET_SUPPORTS_SYNC_CALLS
|
| +#define TARGET_SUPPORTS_SYNC_CALLS 0
|
| +#endif
|
| +
|
| #endif /* _BFIN_CONFIG */
|
|
|