Index: gcc/gcc/config/ia64/ia64.h |
diff --git a/gcc/gcc/config/ia64/ia64.h b/gcc/gcc/config/ia64/ia64.h |
index 0e3c87bf66c4d94a1bb6e830845f7c224338e394..53bbda2b1ede8a9a965cf41d533c2f4408bafa2f 100644 |
--- a/gcc/gcc/config/ia64/ia64.h |
+++ b/gcc/gcc/config/ia64/ia64.h |
@@ -1,6 +1,6 @@ |
/* Definitions of target machine GNU compiler. IA-64 version. |
- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
- Free Software Foundation, Inc. |
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
+ 2009 Free Software Foundation, Inc. |
Contributed by James E. Wilson <wilson@cygnus.com> and |
David Mosberger <davidm@hpl.hp.com>. |
@@ -73,6 +73,8 @@ extern unsigned int ia64_section_threshold; |
#define TARGET_HPUX 0 |
#define TARGET_HPUX_LD 0 |
+#define TARGET_ABI_OPEN_VMS 0 |
+ |
#ifndef TARGET_ILP32 |
#define TARGET_ILP32 0 |
#endif |
@@ -94,7 +96,7 @@ enum ia64_inline_type |
/* Default target_flags if no switches are specified */ |
#ifndef TARGET_DEFAULT |
-#define TARGET_DEFAULT (MASK_DWARF2_ASM) |
+#define TARGET_DEFAULT (MASK_DWARF2_ASM | MASK_FUSED_MADD) |
#endif |
#ifndef TARGET_CPU_DEFAULT |
@@ -279,11 +281,17 @@ while (0) |
#define DOUBLE_TYPE_SIZE 64 |
-/* long double is XFmode normally, TFmode for HPUX. */ |
-#define LONG_DOUBLE_TYPE_SIZE (TARGET_HPUX ? 128 : 80) |
+/* long double is XFmode normally, and TFmode for HPUX. It should be |
+ TFmode for VMS as well but we only support up to DFmode now. */ |
+#define LONG_DOUBLE_TYPE_SIZE \ |
+ (TARGET_HPUX ? 128 \ |
+ : TARGET_ABI_OPEN_VMS ? 64 \ |
+ : 80) |
+ |
+/* We always want the XFmode operations from libgcc2.c, except on VMS |
+ where this yields references to unimplemented "insns". */ |
+#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE (TARGET_ABI_OPEN_VMS ? 64 : 80) |
-/* We always want the XFmode operations from libgcc2.c. */ |
-#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 80 |
/* On HP-UX, we use the l suffix for TFmode in libgcc2.c. */ |
#define LIBGCC2_TF_CEXT l |
@@ -1005,11 +1013,6 @@ enum reg_class |
/* Eliminating the Frame Pointer and the Arg Pointer */ |
-/* A C expression which is nonzero if a function must have and use a frame |
- pointer. This expression is evaluated in the reload pass. If its value is |
- nonzero the function will have a frame pointer. */ |
-#define FRAME_POINTER_REQUIRED 0 |
- |
/* Show we can debug even without a frame pointer. */ |
#define CAN_DEBUG_WITHOUT_FP |
@@ -1024,13 +1027,6 @@ enum reg_class |
{FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ |
} |
-/* A C expression that returns nonzero if the compiler is allowed to try to |
- replace register number FROM with register number TO. The frame pointer |
- is automatically handled. */ |
- |
-#define CAN_ELIMINATE(FROM, TO) \ |
- (TO == BR_REG (0) ? current_function_is_leaf : 1) |
- |
/* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It |
specifies the initial difference between the specified pair of |
registers. This macro must be defined if `ELIMINABLE_REGS' is |
@@ -1082,12 +1078,16 @@ enum reg_class |
`FUNCTION_ARG' and other related values. For some target machines, the type |
`int' suffices and can hold the number of bytes of argument so far. */ |
+enum ivms_arg_type {I64, FF, FD, FG, FS, FT}; |
+/* VMS floating point formats VAX F, VAX D, VAX G, IEEE S, IEEE T. */ |
+ |
typedef struct ia64_args |
{ |
int words; /* # words of arguments so far */ |
int int_regs; /* # GR registers used so far */ |
int fp_regs; /* # FR registers used so far */ |
int prototype; /* whether function prototyped */ |
+ enum ivms_arg_type atypes[8]; /* which VMS float type or if not float */ |
} CUMULATIVE_ARGS; |
/* A C statement (sans semicolon) for initializing the variable CUM for the |
@@ -1099,6 +1099,9 @@ do { \ |
(CUM).int_regs = 0; \ |
(CUM).fp_regs = 0; \ |
(CUM).prototype = ((FNTYPE) && TYPE_ARG_TYPES (FNTYPE)) || (LIBNAME); \ |
+ (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64; \ |
+ (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64; \ |
+ (CUM).atypes[6] = (CUM).atypes[7] = I64; \ |
} while (0) |
/* Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of finding the |
@@ -1113,6 +1116,9 @@ do { \ |
(CUM).int_regs = 0; \ |
(CUM).fp_regs = 0; \ |
(CUM).prototype = 1; \ |
+ (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64; \ |
+ (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64; \ |
+ (CUM).atypes[6] = (CUM).atypes[7] = I64; \ |
} while (0) |
/* A C statement (sans semicolon) to update the summarizer variable CUM to |
@@ -1241,31 +1247,6 @@ do { \ |
#define STACK_SAVEAREA_MODE(LEVEL) \ |
((LEVEL) == SAVE_NONLOCAL ? OImode : Pmode) |
-/* Output assembler code for a block containing the constant parts of |
- a trampoline, leaving space for the variable parts. |
- |
- The trampoline should set the static chain pointer to value placed |
- into the trampoline and should branch to the specified routine. |
- To make the normal indirect-subroutine calling convention work, |
- the trampoline must look like a function descriptor; the first |
- word being the target address and the second being the target's |
- global pointer. |
- |
- We abuse the concept of a global pointer by arranging for it |
- to point to the data we need to load. The complete trampoline |
- has the following form: |
- |
- +-------------------+ \ |
- TRAMP: | __ia64_trampoline | | |
- +-------------------+ > fake function descriptor |
- | TRAMP+16 | | |
- +-------------------+ / |
- | target descriptor | |
- +-------------------+ |
- | static link | |
- +-------------------+ |
-*/ |
- |
/* A C expression for the size in bytes of the trampoline, as an integer. */ |
#define TRAMPOLINE_SIZE 32 |
@@ -1273,11 +1254,6 @@ do { \ |
/* Alignment required for trampolines, in bits. */ |
#define TRAMPOLINE_ALIGNMENT 64 |
- |
-/* A C statement to initialize the variable parts of a trampoline. */ |
- |
-#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \ |
- ia64_initialize_trampoline((ADDR), (FNADDR), (STATIC_CHAIN)) |
/* Addressing Modes */ |
@@ -1344,13 +1320,6 @@ do { \ |
#define REG_OK_FOR_INDEX_P(X) REG_OK_FOR_BASE_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. */ |
- |
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) |
- |
/* A C expression that is nonzero if X is a legitimate constant for an |
immediate operand on the target machine. */ |
@@ -1508,8 +1477,11 @@ do { \ |
do { \ |
assemble_name (STREAM, NAME); \ |
fputs (" = ", STREAM); \ |
+ if (ISDIGIT (*VALUE)) \ |
+ ia64_asm_output_label = 1; \ |
assemble_name (STREAM, VALUE); \ |
fputc ('\n', STREAM); \ |
+ ia64_asm_output_label = 0; \ |
} while (0) |
@@ -1938,7 +1910,7 @@ extern int ia64_final_schedule; |
#define EH_RETURN_DATA_REGNO(N) ((N) < 4 ? (N) + 15 : INVALID_REGNUM) |
/* This function contains machine specific function data. */ |
-struct machine_function GTY(()) |
+struct GTY(()) machine_function |
{ |
/* The new stack pointer when unwinding from EH. */ |
rtx ia64_eh_epilogue_sp; |