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 */ |