Mercurial > hg > CbC > CbC_gcc
diff gcc/config/vax/vax.h @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | a06113de4d67 |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/config/vax/vax.h Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/config/vax/vax.h Fri Feb 12 23:39:51 2010 +0900 @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler. VAX version. Copyright (C) 1987, 1988, 1991, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -63,6 +63,9 @@ /* Nonzero if ELF. Redefined by vax/elf.h. */ #define TARGET_ELF 0 +/* Use BSD names for udiv and umod libgcc calls. */ +#define TARGET_BSD_DIVMOD 1 + /* Default target_flags if no switches specified. */ #ifndef TARGET_DEFAULT @@ -104,7 +107,7 @@ #define STRUCTURE_SIZE_BOUNDARY 8 /* A bit-field declared as `int' forces `int' alignment for the struct. */ -#define PCC_BITFIELD_TYPE_MATTERS (!TARGET_VAXC_ALIGNMENT) +#define PCC_BITFIELD_TYPE_MATTERS (! TARGET_VAXC_ALIGNMENT) /* No data type wants to be aligned rounder than this. */ #define BIGGEST_ALIGNMENT 32 @@ -175,11 +178,8 @@ /* Base register for access to local variables of the function. */ #define FRAME_POINTER_REGNUM VAX_FP_REGNUM -/* 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 1 +/* Offset from the frame pointer register value to the top of stack. */ +#define FRAME_POINTER_CFA_OFFSET(FNDECL) 0 /* Base register for access to arguments of the function. */ #define ARG_POINTER_REGNUM VAX_AP_REGNUM @@ -228,6 +228,20 @@ #define REG_CLASS_NAMES \ { "NO_REGS", "ALL_REGS" } +/* 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 { ALL_REGS, LIM_REG_CLASSES } + +/* Return the maximum number of consecutive registers + needed to represent mode MODE in a register of class CLASS. */ +#define CLASS_MAX_NREGS(CLASS, MODE) \ + ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) + /* Define which registers fit in which classes. This is an initializer for a vector of HARD_REG_SET of length N_REG_CLASSES. */ @@ -246,54 +260,6 @@ #define INDEX_REG_CLASS ALL_REGS #define BASE_REG_CLASS ALL_REGS -/* Get reg_class from a letter such as appears in the machine description. */ - -#define REG_CLASS_FROM_LETTER(C) NO_REGS - -/* The letters I, J, K, L, M, N, and O in a register constraint string - can be used to stand for particular ranges of immediate operands. - This macro defines what the ranges are. - C is the letter, and VALUE is a constant value. - Return 1 if VALUE is in the range specified by C. - - `I' is the constant zero. - `J' is a value between 0 .. 63 (inclusive) - `K' is a value between -128 and 127 (inclusive) - 'L' is a value between -32768 and 32767 (inclusive) - `M' is a value between 0 and 255 (inclusive) - 'N' is a value between 0 and 65535 (inclusive) - `O' is a value between -63 and -1 (inclusive) */ - -#define CONST_OK_FOR_LETTER_P(VALUE, C) \ - ( (C) == 'I' ? (VALUE) == 0 \ - : (C) == 'J' ? 0 <= (VALUE) && (VALUE) < 64 \ - : (C) == 'O' ? -63 <= (VALUE) && (VALUE) < 0 \ - : (C) == 'K' ? -128 <= (VALUE) && (VALUE) < 128 \ - : (C) == 'M' ? 0 <= (VALUE) && (VALUE) < 256 \ - : (C) == 'L' ? -32768 <= (VALUE) && (VALUE) < 32768 \ - : (C) == 'N' ? 0 <= (VALUE) && (VALUE) < 65536 \ - : 0) - -/* Similar, but for floating constants, and defining letters G and H. - Here VALUE is the CONST_DOUBLE rtx itself. - - `G' is a floating-point zero. */ - -#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \ - ((C) == 'G' ? ((VALUE) == CONST0_RTX (DFmode) \ - || (VALUE) == CONST0_RTX (SFmode)) \ - : 0) - -/* Optional extra constraints for this machine. - - For the VAX, `Q' means that OP is a MEM that does not have a mode-dependent - address. */ - -#define EXTRA_CONSTRAINT(OP, C) \ - ((C) == 'Q' \ - ? MEM_P (OP) && !mode_dependent_address_p (XEXP (OP, 0)) \ - : 0) - /* Given an rtx X being reloaded into a reg required to be in class CLASS, return the class of reg to actually use. In general this is just CLASS; but on some machines @@ -462,44 +428,10 @@ #define INITIAL_FRAME_POINTER_OFFSET(DEPTH) (DEPTH) = 0; -/* Output assembler code for a block containing the constant parts - of a trampoline, leaving space for the variable parts. */ - -/* On the VAX, the trampoline contains an entry mask and two instructions: - .word NN - movl $STATIC,r0 (store the functions static chain) - jmp *$FUNCTION (jump to function code at address FUNCTION) */ - -#define TRAMPOLINE_TEMPLATE(FILE) \ -{ \ - assemble_aligned_integer (2, const0_rtx); \ - assemble_aligned_integer (2, GEN_INT (0x8fd0)); \ - assemble_aligned_integer (4, const0_rtx); \ - assemble_aligned_integer (1, GEN_INT (0x50 + STATIC_CHAIN_REGNUM)); \ - assemble_aligned_integer (2, GEN_INT (0x9f17)); \ - assemble_aligned_integer (4, const0_rtx); \ -} - /* Length in units of the trampoline for entering a nested function. */ #define TRAMPOLINE_SIZE 15 -/* 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. */ - -/* We copy the register-mask from the function's pure code - to the start of the trampoline. */ -#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ -{ \ - emit_move_insn (gen_rtx_MEM (HImode, TRAMP), \ - gen_rtx_MEM (HImode, FNADDR)); \ - emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 4)), CXT); \ - emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 11)), \ - plus_constant (FNADDR, 2)); \ - emit_insn (gen_sync_istream ()); \ -} - /* Byte offset of return address in a stack frame. The "saved PC" field is in element [4] when treating the frame as an array of longwords. */ @@ -571,11 +503,6 @@ or if it is a pseudo reg. */ #define REG_OK_FOR_BASE_P(X) 1 -/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression - that is a valid memory address for an instruction. */ -#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ - { if (legitimate_address_p ((MODE), (X), 0)) goto ADDR; } - #else /* Nonzero if X is a hard reg that can be used as an index. */ @@ -584,11 +511,6 @@ /* Nonzero if X is a hard reg that can be used as a base reg. */ #define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) -/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression - that is a valid memory address for an instruction. */ -#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ - { if (legitimate_address_p ((MODE), (X), 1)) goto ADDR; } - #endif /* Go to LABEL if ADDR (a legitimate address expression) @@ -621,6 +543,11 @@ in one reasonably fast instruction. */ #define MOVE_MAX 8 +/* If a memory-to-memory move would take MOVE_RATIO or more simple + move-instruction pairs, we will do a movmem or libcall instead. */ +#define MOVE_RATIO(speed) ((speed) ? 6 : 3) +#define CLEAR_RATIO(speed) ((speed) ? 6 : 2) + /* Nonzero if access to memory by bytes is slow and undesirable. */ #define SLOW_BYTE_ACCESS 0 @@ -828,6 +755,7 @@ VAX operand formatting codes: letter print + c direct branch condition C reverse branch condition D 64-bit immediate operand B the low 8 bits of the complement of a constant operand @@ -851,49 +779,11 @@ # define NEG_HWI_PRINT_HEX16 "0xffffffff%08lx" #endif -#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ +#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ ((CODE) == '#' || (CODE) == '|') -#define PRINT_OPERAND(FILE, X, CODE) \ -{ if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE); \ - else if (CODE == '|') \ - fputs (REGISTER_PREFIX, FILE); \ - else if (CODE == 'C') \ - fputs (rev_cond_name (X), FILE); \ - else if (CODE == 'D' && CONST_INT_P (X) && INTVAL (X) < 0) \ - fprintf (FILE, "$" NEG_HWI_PRINT_HEX16, INTVAL (X)); \ - else if (CODE == 'P' && CONST_INT_P (X)) \ - fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, INTVAL (X) + 1); \ - else if (CODE == 'N' && CONST_INT_P (X)) \ - fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, ~ INTVAL (X)); \ - /* rotl instruction cannot deal with negative arguments. */ \ - else if (CODE == 'R' && CONST_INT_P (X)) \ - fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (X)); \ - else if (CODE == 'H' && CONST_INT_P (X)) \ - fprintf (FILE, "$%d", (int) (0xffff & ~ INTVAL (X))); \ - else if (CODE == 'h' && CONST_INT_P (X)) \ - fprintf (FILE, "$%d", (short) - INTVAL (x)); \ - else if (CODE == 'B' && CONST_INT_P (X)) \ - fprintf (FILE, "$%d", (int) (0xff & ~ INTVAL (X))); \ - else if (CODE == 'b' && CONST_INT_P (X)) \ - fprintf (FILE, "$%d", (int) (0xff & - INTVAL (X))); \ - else if (CODE == 'M' && CONST_INT_P (X)) \ - fprintf (FILE, "$%d", ~((1 << INTVAL (x)) - 1)); \ - else if (REG_P (X)) \ - fprintf (FILE, "%s", reg_names[REGNO (X)]); \ - else if (MEM_P (X)) \ - output_address (XEXP (X, 0)); \ - else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \ - { char dstr[30]; \ - real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \ - sizeof (dstr), 0, 1); \ - fprintf (FILE, "$0f%s", dstr); } \ - else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \ - { char dstr[30]; \ - real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \ - sizeof (dstr), 0, 1); \ - fprintf (FILE, "$0%c%s", ASM_DOUBLE_CHAR, dstr); } \ - else { putc ('$', FILE); output_addr_const (FILE, X); }} +#define PRINT_OPERAND(FILE, X, CODE) \ + print_operand (FILE, X, CODE) /* Print a memory operand whose address is X, on file FILE. This uses a function in output-vax.c. */