Index: gcc/gcc/config/i386/i386.h |
diff --git a/gcc/gcc/config/i386/i386.h b/gcc/gcc/config/i386/i386.h |
index 23c0d183eef9a8b69a0b6df6ff70911c87d83334..5bae99d9dbbe18581f9a5a22f0fe0842f7212a34 100644 |
--- a/gcc/gcc/config/i386/i386.h |
+++ b/gcc/gcc/config/i386/i386.h |
@@ -1,6 +1,6 @@ |
/* Definitions of target machine for GCC for IA-32. |
Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
Free Software Foundation, Inc. |
This file is part of GCC. |
@@ -54,18 +54,22 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
#define TARGET_AVX OPTION_ISA_AVX |
#define TARGET_FMA OPTION_ISA_FMA |
#define TARGET_SSE4A OPTION_ISA_SSE4A |
-#define TARGET_SSE5 OPTION_ISA_SSE5 |
+#define TARGET_FMA4 OPTION_ISA_FMA4 |
+#define TARGET_XOP OPTION_ISA_XOP |
+#define TARGET_LWP OPTION_ISA_LWP |
#define TARGET_ROUND OPTION_ISA_ROUND |
#define TARGET_ABM OPTION_ISA_ABM |
#define TARGET_POPCNT OPTION_ISA_POPCNT |
#define TARGET_SAHF OPTION_ISA_SAHF |
+#define TARGET_MOVBE OPTION_ISA_MOVBE |
+#define TARGET_CRC32 OPTION_ISA_CRC32 |
#define TARGET_AES OPTION_ISA_AES |
#define TARGET_PCLMUL OPTION_ISA_PCLMUL |
#define TARGET_CMPXCHG16B OPTION_ISA_CX16 |
-/* SSE5 and SSE4.1 define the same round instructions */ |
-#define OPTION_MASK_ISA_ROUND (OPTION_MASK_ISA_SSE4_1 | OPTION_MASK_ISA_SSE5) |
+/* SSE4.1 defines round instructions */ |
+#define OPTION_MASK_ISA_ROUND OPTION_MASK_ISA_SSE4_1 |
#define OPTION_ISA_ROUND ((ix86_isa_flags & OPTION_MASK_ISA_ROUND) != 0) |
#include "config/vxworks-dummy.h" |
@@ -236,6 +240,7 @@ extern const struct processor_costs ix86_size_cost; |
#define TARGET_GENERIC64 (ix86_tune == PROCESSOR_GENERIC64) |
#define TARGET_GENERIC (TARGET_GENERIC32 || TARGET_GENERIC64) |
#define TARGET_AMDFAM10 (ix86_tune == PROCESSOR_AMDFAM10) |
+#define TARGET_ATOM (ix86_tune == PROCESSOR_ATOM) |
/* Feature tests against the various tunings. */ |
enum ix86_tune_indices { |
@@ -300,6 +305,7 @@ enum ix86_tune_indices { |
X86_TUNE_USE_VECTOR_FP_CONVERTS, |
X86_TUNE_USE_VECTOR_CONVERTS, |
X86_TUNE_FUSE_CMP_AND_BRANCH, |
+ X86_TUNE_OPT_AGU, |
X86_TUNE_LAST |
}; |
@@ -387,6 +393,7 @@ extern unsigned char ix86_tune_features[X86_TUNE_LAST]; |
ix86_tune_features[X86_TUNE_USE_VECTOR_CONVERTS] |
#define TARGET_FUSE_CMP_AND_BRANCH \ |
ix86_tune_features[X86_TUNE_FUSE_CMP_AND_BRANCH] |
+#define TARGET_OPT_AGU ix86_tune_features[X86_TUNE_OPT_AGU] |
/* Feature tests against the various architecture variations. */ |
enum ix86_arch_indices { |
@@ -422,7 +429,7 @@ extern int x86_prefetch_sse; |
#define TARGET_GNU_TLS (ix86_tls_dialect == TLS_DIALECT_GNU) |
#define TARGET_GNU2_TLS (ix86_tls_dialect == TLS_DIALECT_GNU2) |
#define TARGET_ANY_GNU_TLS (TARGET_GNU_TLS || TARGET_GNU2_TLS) |
-#define TARGET_SUN_TLS (ix86_tls_dialect == TLS_DIALECT_SUN) |
+#define TARGET_SUN_TLS 0 |
extern int ix86_isa_flags; |
@@ -470,7 +477,10 @@ enum calling_abi |
MS_ABI = 1 |
}; |
-/* The default abi form used by target. */ |
+/* The abi used by target. */ |
+extern enum calling_abi ix86_abi; |
+ |
+/* The default abi used by target. */ |
#define DEFAULT_ABI SYSV_ABI |
/* Subtargets may reset this to 1 in order to enable 96-bit long double |
@@ -534,6 +544,8 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); |
%<mcpu=* \ |
%{mintel-syntax:-masm=intel \ |
%n`-mintel-syntax' is deprecated. Use `-masm=intel' instead.\n} \ |
+%{msse5:-mavx \ |
+%n'-msse5' was removed.\n} \ |
%{mno-intel-syntax:-masm=att \ |
%n`-mno-intel-syntax' is deprecated. Use `-masm=att' instead.\n}" |
@@ -569,6 +581,7 @@ enum target_cpu_default |
TARGET_CPU_DEFAULT_prescott, |
TARGET_CPU_DEFAULT_nocona, |
TARGET_CPU_DEFAULT_core2, |
+ TARGET_CPU_DEFAULT_atom, |
TARGET_CPU_DEFAULT_geode, |
TARGET_CPU_DEFAULT_k6, |
@@ -613,6 +626,20 @@ enum target_cpu_default |
#define TARGET_FLT_EVAL_METHOD \ |
(TARGET_MIX_SSE_I387 ? -1 : TARGET_SSE_MATH ? 0 : 2) |
+/* Whether to allow x87 floating-point arithmetic on MODE (one of |
+ SFmode, DFmode and XFmode) in the current excess precision |
+ configuration. */ |
+#define X87_ENABLE_ARITH(MODE) \ |
+ (flag_excess_precision == EXCESS_PRECISION_FAST || (MODE) == XFmode) |
+ |
+/* Likewise, whether to allow direct conversions from integer mode |
+ IMODE (HImode, SImode or DImode) to MODE. */ |
+#define X87_ENABLE_FLOAT(MODE, IMODE) \ |
+ (flag_excess_precision == EXCESS_PRECISION_FAST \ |
+ || (MODE) == XFmode \ |
+ || ((MODE) == DFmode && (IMODE) == SImode) \ |
+ || (IMODE) == HImode) |
+ |
/* target machine storage layout */ |
#define SHORT_TYPE_SIZE 16 |
@@ -658,7 +685,7 @@ enum target_cpu_default |
/* Boundary (in *bits*) on which stack pointer should be aligned. */ |
#define STACK_BOUNDARY \ |
- (TARGET_64BIT && DEFAULT_ABI == MS_ABI ? 128 : BITS_PER_WORD) |
+ (TARGET_64BIT && ix86_abi == MS_ABI ? 128 : BITS_PER_WORD) |
/* Stack boundary of the main function guaranteed by OS. */ |
#define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32) |
@@ -679,9 +706,7 @@ enum target_cpu_default |
generate an alternate prologue and epilogue that realigns the |
runtime stack if nessary. This supports mixing codes that keep a |
4-byte aligned stack, as specified by i386 psABI, with codes that |
- need a 16-byte aligned stack, as required by SSE instructions. If |
- STACK_REALIGN_DEFAULT is 1 and PREFERRED_STACK_BOUNDARY_DEFAULT is |
- 128, stacks for all functions may be realigned. */ |
+ need a 16-byte aligned stack, as required by SSE instructions. */ |
#define STACK_REALIGN_DEFAULT 0 |
/* Boundary (in *bits*) on which the incoming stack is aligned. */ |
@@ -846,6 +871,9 @@ enum target_cpu_default |
|| ((MODE) == DFmode && (!TARGET_SSE2 || !TARGET_SSE_MATH)) \ |
|| (MODE) == XFmode) |
+/* Cover class containing the stack registers. */ |
+#define STACK_REG_COVER_CLASS FLOAT_REGS |
+ |
/* Number of actual hardware registers. |
The hardware registers are assigned numbers for the compiler |
from 0 to just below FIRST_PSEUDO_REGISTER. |
@@ -985,7 +1013,8 @@ enum target_cpu_default |
|| (MODE) == V2DImode || (MODE) == DFmode) |
#define VALID_SSE_REG_MODE(MODE) \ |
- ((MODE) == TImode || (MODE) == V4SFmode || (MODE) == V4SImode \ |
+ ((MODE) == V1TImode || (MODE) == TImode \ |
+ || (MODE) == V4SFmode || (MODE) == V4SImode \ |
|| (MODE) == SFmode || (MODE) == TFmode) |
#define VALID_MMX_REG_MODE_3DNOW(MODE) \ |
@@ -1023,11 +1052,11 @@ enum target_cpu_default |
/* Return true for modes passed in SSE registers. */ |
#define SSE_REG_MODE_P(MODE) \ |
- ((MODE) == TImode || (MODE) == V16QImode || (MODE) == TFmode \ |
- || (MODE) == V8HImode || (MODE) == V2DFmode || (MODE) == V2DImode \ |
- || (MODE) == V4SFmode || (MODE) == V4SImode || (MODE) == V32QImode \ |
- || (MODE) == V16HImode || (MODE) == V8SImode || (MODE) == V4DImode \ |
- || (MODE) == V8SFmode || (MODE) == V4DFmode) |
+ ((MODE) == V1TImode || (MODE) == TImode || (MODE) == V16QImode \ |
+ || (MODE) == TFmode || (MODE) == V8HImode || (MODE) == V2DFmode \ |
+ || (MODE) == V2DImode || (MODE) == V4SFmode || (MODE) == V4SImode \ |
+ || (MODE) == V32QImode || (MODE) == V16HImode || (MODE) == V8SImode \ |
+ || (MODE) == V4DImode || (MODE) == V8SFmode || (MODE) == V4DFmode) |
/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */ |
@@ -1093,12 +1122,6 @@ enum target_cpu_default |
#define FIRST_REX_SSE_REG (LAST_REX_INT_REG + 1) |
#define LAST_REX_SSE_REG (FIRST_REX_SSE_REG + 7) |
-/* 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 ix86_frame_pointer_required () |
- |
/* Override this in other tm.h files to cope with various OS lossage |
requiring a frame pointer. */ |
#ifndef SUBTARGET_FRAME_POINTER_REQUIRED |
@@ -1111,11 +1134,6 @@ enum target_cpu_default |
/* Base register for access to arguments of the function. */ |
#define ARG_POINTER_REGNUM 16 |
-/* Register in which static-chain is passed to a function. |
- We do use ECX as static chain register for 32 bit ABI. On the |
- 64bit ABI, ECX is an argument register, so we use R10 instead. */ |
-#define STATIC_CHAIN_REGNUM (TARGET_64BIT ? R10_REG : CX_REG) |
- |
/* Register to hold the addressing base for position independent |
code access to data items. We don't use PIC pointer for 64bit |
mode. Define the regnum to dummy value to prevent gcc from |
@@ -1271,19 +1289,6 @@ enum reg_class |
{ 0xffffffff,0x1fffff } \ |
} |
-/* 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, FLOAT_REGS, MMX_REGS, SSE_REGS, LIM_REG_CLASSES \ |
-} |
- |
/* The same information, inverted: |
Return the class number of the smallest class containing |
reg number REGNO. This could be a conditional expression |
@@ -1349,6 +1354,10 @@ enum reg_class |
(TARGET_AVX && ((MODE) == V4SFmode || (MODE) == V2DFmode \ |
|| (MODE) == V8SFmode || (MODE) == V4DFmode)) |
+#define FMA4_VEC_FLOAT_MODE_P(MODE) \ |
+ (TARGET_FMA4 && ((MODE) == V4SFmode || (MODE) == V2DFmode \ |
+ || (MODE) == V8SFmode || (MODE) == V4DFmode)) |
+ |
#define MMX_REG_P(XOP) (REG_P (XOP) && MMX_REGNO_P (REGNO (XOP))) |
#define MMX_REGNO_P(N) IN_RANGE ((N), FIRST_MMX_REG, LAST_MMX_REG) |
@@ -1584,7 +1593,7 @@ typedef struct ix86_args { |
int maybe_vaarg; /* true for calls to possibly vardic fncts. */ |
int float_in_sse; /* 1 if in 32-bit mode SFmode (2 for DFmode) should |
be passed in SSE registers. Otherwise 0. */ |
- int call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise |
+ enum calling_abi call_abi; /* Set to SYSV_ABI for sysv abi. Otherwise |
MS_ABI for ms abi. */ |
} CUMULATIVE_ARGS; |
@@ -1618,9 +1627,6 @@ typedef struct ix86_args { |
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ |
function_arg (&(CUM), (MODE), (TYPE), (NAMED)) |
-#define TARGET_ASM_FILE_END ix86_file_end |
-#define NEED_INDICATE_EXEC_STACK 0 |
- |
/* Output assembler code to FILE to increment profiler label # LABELNO |
for profiling a function entry. */ |
@@ -1652,14 +1658,7 @@ typedef struct ix86_args { |
/* Length in units of the trampoline for entering a nested function. */ |
-#define TRAMPOLINE_SIZE (TARGET_64BIT ? 23 : 10) |
- |
-/* 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) \ |
- x86_initialize_trampoline ((TRAMP), (FNADDR), (CXT)) |
+#define TRAMPOLINE_SIZE (TARGET_64BIT ? 24 : 10) |
/* Definitions for register eliminations. |
@@ -1680,11 +1679,6 @@ typedef struct ix86_args { |
{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ |
{ FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}} \ |
-/* Given FROM and TO register numbers, say whether this elimination is |
- allowed. */ |
- |
-#define CAN_ELIMINATE(FROM, TO) ix86_can_eliminate ((FROM), (TO)) |
- |
/* Define the offset between two registers, one to be eliminated, and the other |
its replacement, at the start of a routine. */ |
@@ -1752,12 +1746,12 @@ typedef struct ix86_args { |
#define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X) |
#endif |
-/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression |
+/* TARGET_LEGITIMATE_ADDRESS_P 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, |
+ The other macros defined here are used only in TARGET_LEGITIMATE_ADDRESS_P, |
except for CONSTANT_ADDRESS_P which is usually machine-independent. |
See legitimize_pic_address in i386.c for details as to what |
@@ -1772,22 +1766,6 @@ typedef struct ix86_args { |
#define LEGITIMATE_CONSTANT_P(X) legitimate_constant_p (X) |
-#ifdef REG_OK_STRICT |
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ |
-do { \ |
- if (legitimate_address_p ((MODE), (X), 1)) \ |
- goto ADDR; \ |
-} while (0) |
- |
-#else |
-#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ |
-do { \ |
- if (legitimate_address_p ((MODE), (X), 0)) \ |
- goto ADDR; \ |
-} while (0) |
- |
-#endif |
- |
/* If defined, a C expression to determine the base term of address X. |
This macro is used in only one place: `find_base_term' in alias.c. |
@@ -1799,34 +1777,6 @@ do { \ |
#define FIND_BASE_TERM(X) ix86_find_base_term (X) |
-/* 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. |
- |
- For the 80386, we handle X+REG by loading X into a register R and |
- using R+REG. R will go in a general reg and indexing will be used. |
- However, if REG is a broken-out memory address or multiplication, |
- nothing needs to be done because REG can certainly go in a general reg. |
- |
- When -fpic is used, special handling is needed for symbolic references. |
- See comments by legitimize_pic_address in i386.c for details. */ |
- |
-#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \ |
-do { \ |
- (X) = legitimize_address ((X), (OLDX), (MODE)); \ |
- if (memory_address_p ((MODE), (X))) \ |
- goto WIN; \ |
-} while (0) |
- |
/* Nonzero if the constant value X is a legitimate general operand |
when generating PIC code. It is given that flag_pic is on and |
that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ |
@@ -1837,13 +1787,6 @@ do { \ |
(GET_CODE (X) == SYMBOL_REF \ |
|| GET_CODE (X) == LABEL_REF \ |
|| (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X))) |
- |
-/* Go to LABEL if ADDR (a legitimate address expression) |
- has an effect that depends on the machine mode it is used for. |
- On the 80386, only postdecrement and postincrement address depend thus |
- (the amount of decrement or increment being the length of the operand). |
- These are now caught in recog.c. */ |
-#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) |
/* Max number of args passed in registers. If this is more than 3, we will |
have problems with ebx (register #4), since it is a caller save register and |
@@ -1852,20 +1795,22 @@ do { \ |
/* Abi specific values for REGPARM_MAX and SSE_REGPARM_MAX */ |
#define X86_64_REGPARM_MAX 6 |
-#define X64_REGPARM_MAX 4 |
-#define X86_32_REGPARM_MAX 3 |
+#define X86_64_MS_REGPARM_MAX 4 |
-#define X86_64_SSE_REGPARM_MAX 8 |
-#define X64_SSE_REGPARM_MAX 4 |
-#define X86_32_SSE_REGPARM_MAX (TARGET_SSE ? 3 : 0) |
+#define X86_32_REGPARM_MAX 3 |
#define REGPARM_MAX \ |
- (TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X64_REGPARM_MAX \ |
+ (TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X86_64_MS_REGPARM_MAX \ |
: X86_64_REGPARM_MAX) \ |
: X86_32_REGPARM_MAX) |
+#define X86_64_SSE_REGPARM_MAX 8 |
+#define X86_64_MS_SSE_REGPARM_MAX 4 |
+ |
+#define X86_32_SSE_REGPARM_MAX (TARGET_SSE ? (TARGET_MACHO ? 4 : 3) : 0) |
+ |
#define SSE_REGPARM_MAX \ |
- (TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X64_SSE_REGPARM_MAX \ |
+ (TARGET_64BIT ? (TARGET_64BIT_MS_ABI ? X86_64_MS_SSE_REGPARM_MAX \ |
: X86_64_SSE_REGPARM_MAX) \ |
: X86_32_SSE_REGPARM_MAX) |
@@ -2175,6 +2120,22 @@ do { \ |
#define ASM_OUTPUT_OPCODE(STREAM, PTR) \ |
ASM_OUTPUT_AVX_PREFIX ((STREAM), (PTR)) |
+/* A C statement to output to the stdio stream FILE an assembler |
+ command to pad the location counter to a multiple of 1<<LOG |
+ bytes if it is within MAX_SKIP bytes. */ |
+ |
+#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN |
+#undef ASM_OUTPUT_MAX_SKIP_PAD |
+#define ASM_OUTPUT_MAX_SKIP_PAD(FILE, LOG, MAX_SKIP) \ |
+ if ((LOG) != 0) \ |
+ { \ |
+ if ((MAX_SKIP) == 0) \ |
+ fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ |
+ else \ |
+ fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ |
+ } |
+#endif |
+ |
/* Under some conditions we need jump tables in the text section, |
because the assembler cannot handle label differences between |
sections. This is the case for x86_64 on Mach-O for example. */ |
@@ -2186,9 +2147,12 @@ do { \ |
/* Switch to init or fini section via SECTION_OP, emit a call to FUNC, |
and switch back. For x86 we do this only to save a few bytes that |
would otherwise be unused in the text section. */ |
-#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ |
- asm (SECTION_OP "\n\t" \ |
- "call " USER_LABEL_PREFIX #FUNC "\n" \ |
+#define CRT_MKSTR2(VAL) #VAL |
+#define CRT_MKSTR(x) CRT_MKSTR2(x) |
+ |
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ |
+ asm (SECTION_OP "\n\t" \ |
+ "call " CRT_MKSTR(__USER_LABEL_PREFIX__) #FUNC "\n" \ |
TEXT_SECTION_ASM_OP); |
/* Print operand X (an rtx) in assembler syntax to file FILE. |
@@ -2230,6 +2194,7 @@ enum processor_type |
PROCESSOR_GENERIC32, |
PROCESSOR_GENERIC64, |
PROCESSOR_AMDFAM10, |
+ PROCESSOR_ATOM, |
PROCESSOR_max |
}; |
@@ -2286,7 +2251,12 @@ extern enum reg_class const regclass_map[FIRST_PSEUDO_REGISTER]; |
extern rtx ix86_compare_op0; /* operand 0 for comparisons */ |
extern rtx ix86_compare_op1; /* operand 1 for comparisons */ |
-extern rtx ix86_compare_emitted; |
+ |
+enum ix86_fpcmp_strategy { |
+ IX86_FPCMP_SAHF, |
+ IX86_FPCMP_COMI, |
+ IX86_FPCMP_ARITH |
+}; |
/* To properly truncate FP values into integers, we need to set i387 control |
word. We can't emit proper mode switching code before reload, as spills |
@@ -2376,21 +2346,43 @@ enum ix86_stack_slot |
#define FASTCALL_PREFIX '@' |
-struct machine_function GTY(()) |
+/* Machine specific CFA tracking during prologue/epilogue generation. */ |
+ |
+#ifndef USED_FOR_TARGET |
+struct GTY(()) machine_cfa_state |
{ |
+ rtx reg; |
+ HOST_WIDE_INT offset; |
+}; |
+ |
+struct GTY(()) machine_function { |
struct stack_local_entry *stack_locals; |
const char *some_ld_name; |
int varargs_gpr_size; |
int varargs_fpr_size; |
- int accesses_prev_frame; |
int optimize_mode_switching[MAX_386_ENTITIES]; |
- int needs_cld; |
+ |
+ /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE |
+ has been computed for. */ |
+ int use_fast_prologue_epilogue_nregs; |
+ |
+ /* The CFA state at the end of the prologue. */ |
+ struct machine_cfa_state cfa; |
+ |
+ /* This value is used for amd64 targets and specifies the current abi |
+ to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi. */ |
+ enum calling_abi call_abi; |
+ |
+ /* Nonzero if the function accesses a previous frame. */ |
+ BOOL_BITFIELD accesses_prev_frame : 1; |
+ |
+ /* Nonzero if the function requires a CLD in the prologue. */ |
+ BOOL_BITFIELD needs_cld : 1; |
+ |
/* Set by ix86_compute_frame_layout and used by prologue/epilogue |
expander to determine the style used. */ |
- int use_fast_prologue_epilogue; |
- /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE has been computed |
- for. */ |
- int use_fast_prologue_epilogue_nregs; |
+ BOOL_BITFIELD use_fast_prologue_epilogue : 1; |
+ |
/* If true, the current function needs the default PIC register, not |
an alternate register (on x86) and must not use the red zone (on |
x86_64), even if it's a leaf function. We don't want the |
@@ -2400,11 +2392,13 @@ struct machine_function GTY(()) |
if all such instructions are optimized away. Use the |
ix86_current_function_calls_tls_descriptor macro for a better |
approximation. */ |
- int tls_descriptor_call_expanded_p; |
- /* This value is used for amd64 targets and specifies the current abi |
- to be used. MS_ABI means ms abi. Otherwise SYSV_ABI means sysv abi. */ |
- int call_abi; |
+ BOOL_BITFIELD tls_descriptor_call_expanded_p : 1; |
+ |
+ /* If true, the current function has a STATIC_CHAIN is placed on the |
+ stack below the return address. */ |
+ BOOL_BITFIELD static_chain_on_stack : 1; |
}; |
+#endif |
#define ix86_stack_locals (cfun->machine->stack_locals) |
#define ix86_varargs_gpr_size (cfun->machine->varargs_gpr_size) |
@@ -2420,6 +2414,8 @@ struct machine_function GTY(()) |
REG_SP is live. */ |
#define ix86_current_function_calls_tls_descriptor \ |
(ix86_tls_descriptor_calls_expanded_in_cfun && df_regs_ever_live_p (SP_REG)) |
+#define ix86_cfa_state (&cfun->machine->cfa) |
+#define ix86_static_chain_on_stack (cfun->machine->static_chain_on_stack) |
/* Control behavior of x86_file_start. */ |
#define X86_FILE_START_VERSION_DIRECTIVE false |