Index: gcc/gcc/config/mn10300/mn10300.h |
diff --git a/gcc/gcc/config/mn10300/mn10300.h b/gcc/gcc/config/mn10300/mn10300.h |
index f7011daf493c3bff7373642a25bccbc245f5bf70..3d9933e18aa43b1b62524a47cb80872334933b00 100644 |
--- a/gcc/gcc/config/mn10300/mn10300.h |
+++ b/gcc/gcc/config/mn10300/mn10300.h |
@@ -1,7 +1,7 @@ |
/* Definitions of target machine for GNU compiler. |
Matsushita MN10300 series |
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, |
- 2007, 2008 Free Software Foundation, Inc. |
+ 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
Contributed by Jeff Law (law@cygnus.com). |
This file is part of GCC. |
@@ -130,6 +130,7 @@ extern enum processor_type mn10300_processor; |
#define LAST_EXTENDED_REGNUM 17 |
#define FIRST_FP_REGNUM 18 |
#define LAST_FP_REGNUM 49 |
+#define FIRST_ARGUMENT_REGNUM 0 |
/* Specify the registers used for certain standard purposes. |
The values of these macros are register numbers. */ |
@@ -484,14 +485,11 @@ enum reg_class { |
{ ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ |
{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} |
-#define CAN_ELIMINATE(FROM, TO) 1 |
- |
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ |
OFFSET = initial_offset (FROM, TO) |
/* We can debug without frame pointers on the mn10300, so eliminate |
them whenever possible. */ |
-#define FRAME_POINTER_REQUIRED 0 |
#define CAN_DEBUG_WITHOUT_FP |
/* Value is the number of bytes of arguments automatically |
@@ -514,7 +512,7 @@ enum reg_class { |
#define STACK_POINTER_OFFSET 4 |
/* 1 if N is a possible register number for function argument passing. |
- On the MN10300, no registers are used in this way. */ |
+ On the MN10300, d0 and d1 are used in this way. */ |
#define FUNCTION_ARG_REGNO_P(N) ((N) <= 1) |
@@ -562,30 +560,10 @@ struct cum_arg {int nbytes; }; |
NAMED is nonzero if this argument is a named parameter |
(otherwise it is an extra parameter matching an ellipsis). */ |
-/* On the MN10300 all args are pushed. */ |
- |
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ |
function_arg (&CUM, MODE, TYPE, NAMED) |
-/* 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. */ |
- |
-#define FUNCTION_VALUE(VALTYPE, FUNC) \ |
- mn10300_function_value (VALTYPE, FUNC, 0) |
-#define FUNCTION_OUTGOING_VALUE(VALTYPE, FUNC) \ |
- mn10300_function_value (VALTYPE, FUNC, 1) |
- |
-/* Define how to find the value returned by a library function |
- assuming the value has mode MODE. */ |
- |
-#define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, FIRST_DATA_REGNUM) |
- |
-/* 1 if N is a possible register number for a function value. */ |
- |
-#define FUNCTION_VALUE_REGNO_P(N) \ |
- ((N) == FIRST_DATA_REGNUM || (N) == FIRST_ADDRESS_REGNUM) |
+#define FUNCTION_VALUE_REGNO_P(N) mn10300_function_value_regno_p (N) |
#define DEFAULT_PCC_STRUCT_RETURN 0 |
@@ -601,36 +579,12 @@ struct cum_arg {int nbytes; }; |
#define FUNCTION_PROFILER(FILE, LABELNO) ; |
-#define TRAMPOLINE_TEMPLATE(FILE) \ |
- do { \ |
- fprintf (FILE, "\tadd -4,sp\n"); \ |
- fprintf (FILE, "\t.long 0x0004fffa\n"); \ |
- fprintf (FILE, "\tmov (0,sp),a0\n"); \ |
- fprintf (FILE, "\tadd 4,sp\n"); \ |
- fprintf (FILE, "\tmov (13,a0),a1\n"); \ |
- fprintf (FILE, "\tmov (17,a0),a0\n"); \ |
- fprintf (FILE, "\tjmp (a0)\n"); \ |
- fprintf (FILE, "\t.long 0\n"); \ |
- fprintf (FILE, "\t.long 0\n"); \ |
- } while (0) |
- |
/* Length in units of the trampoline for entering a nested function. */ |
#define TRAMPOLINE_SIZE 0x1b |
#define TRAMPOLINE_ALIGNMENT 32 |
-/* Emit RTL insns to initialize the variable parts of a trampoline. |
- FNADDR is an RTX for the address of the function's pure code. |
- CXT is an RTX for the static chain value for the function. */ |
- |
-#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ |
-{ \ |
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 0x14)), \ |
- (CXT)); \ |
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 0x18)), \ |
- (FNADDR)); \ |
-} |
/* A C expression whose value is RTL representing the value of the return |
address for the frame COUNT steps up from the current frame. |
@@ -645,10 +599,6 @@ struct cum_arg {int nbytes; }; |
? gen_rtx_MEM (Pmode, arg_pointer_rtx) \ |
: (rtx) 0) |
-/* 1 if X is an rtx for a constant that is a valid address. */ |
- |
-#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X) |
- |
/* Maximum number of registers that can appear in a valid memory address. */ |
#define MAX_REGS_PER_ADDRESS 2 |
@@ -656,26 +606,6 @@ struct cum_arg {int nbytes; }; |
#define HAVE_POST_INCREMENT (TARGET_AM33) |
-/* 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. |
- |
- The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS, |
- except for CONSTANT_ADDRESS_P which is actually |
- machine-independent. |
- |
- On the mn10300, the value in the address register must be |
- in the same memory space/segment as the effective address. |
- |
- This is problematical for reload since it does not understand |
- that base+index != index+base in a memory reference. |
- |
- Note it is still possible to use reg+reg addressing modes, |
- it's just much more difficult. For a discussion of a possible |
- workaround and solution, see the comments in pa.c before the |
- function record_unscaled_index_insn_codes. */ |
- |
/* Accept either REG or SUBREG where a register is valid. */ |
#define RTX_OK_FOR_BASE_P(X, strict) \ |
@@ -685,38 +615,7 @@ struct cum_arg {int nbytes; }; |
&& REGNO_STRICT_OK_FOR_BASE_P (REGNO (SUBREG_REG (X)), \ |
(strict)))) |
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ |
-do \ |
- { \ |
- if (legitimate_address_p ((MODE), (X), REG_STRICT)) \ |
- goto ADDR; \ |
- } \ |
-while (0) |
- |
-/* 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) \ |
-{ rtx orig_x = (X); \ |
- (X) = legitimize_address (X, OLDX, MODE); \ |
- if ((X) != orig_x && memory_address_p (MODE, X)) \ |
- goto WIN; } |
- |
-/* Go to LABEL if ADDR (a legitimate address expression) |
- has an effect that depends on the machine mode it is used for. */ |
- |
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) |
/* Nonzero if the constant value X is a legitimate general operand. |
It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ |
@@ -815,14 +714,6 @@ while (0) |
than accessing full words. */ |
#define SLOW_BYTE_ACCESS 1 |
-/* Dispatch tables on the mn10300 are extremely expensive in terms of code |
- and readonly data size. So we crank up the case threshold value to |
- encourage a series of if/else comparisons to implement many small switch |
- statements. In theory, this value could be increased much more if we |
- were solely optimizing for space, but we keep it "reasonable" to avoid |
- serious code efficiency lossage. */ |
-#define CASE_VALUES_THRESHOLD 6 |
- |
#define NO_FUNCTION_CSE |
/* According expr.c, a value of around 6 should minimize code size, and |
@@ -845,6 +736,9 @@ while (0) |
#define ASM_APP_OFF "#NO_APP\n" |
+#undef USER_LABEL_PREFIX |
+#define USER_LABEL_PREFIX "_" |
+ |
/* 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. */ |
@@ -860,7 +754,7 @@ while (0) |
#undef ASM_OUTPUT_LABELREF |
#define ASM_OUTPUT_LABELREF(FILE, NAME) \ |
- fprintf (FILE, "_%s", (*targetm.strip_name_encoding) (NAME)) |
+ asm_fprintf (FILE, "%U%s", (*targetm.strip_name_encoding) (NAME)) |
#define ASM_PN_FORMAT "%s___%lu" |