diff options
Diffstat (limited to 'gcc/config/ip2k/ip2k.h')
-rw-r--r-- | gcc/config/ip2k/ip2k.h | 2523 |
1 files changed, 0 insertions, 2523 deletions
diff --git a/gcc/config/ip2k/ip2k.h b/gcc/config/ip2k/ip2k.h deleted file mode 100644 index cda748744d2..00000000000 --- a/gcc/config/ip2k/ip2k.h +++ /dev/null @@ -1,2523 +0,0 @@ -/* Definitions of target machine for GNU compiler, - For Ubicom IP2022 Communications Controller - - Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. - Contributed by Red Hat, Inc and Ubicom, Inc. - -This file is part of GNU CC. - -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* Set up System V.4 (aka ELF) defaults. */ - -#include "elfos.h" -#undef ASM_SPEC /* But we have a GAS assembler. */ - -#define CPP_PREDEFINES \ - "-DIP2K -D_DOUBLE_IS_32BITS -D__BUFSIZ__=512 -D__FILENAME_MAX__=128" -/* Define this to be a string constant containing `-D' options to - define the predefined macros that identify this machine and system. - These macros will be predefined unless the `-ansi' option is - specified. - - In addition, a parallel set of macros are predefined, whose names - are made by appending `__' at the beginning and at the end. These - `__' macros are permitted by the ANSI standard, so they are - predefined regardless of whether `-ansi' is specified. - - For example, on the Sun, one can use the following value: - - "-Dmc68000 -Dsun -Dunix" - - The result is to define the macros `__mc68000__', `__sun__' and - `__unix__' unconditionally, and the macros `mc68000', `sun' and - `unix' provided `-ansi' is not specified. */ - - -/* This declaration should be present. */ -extern int target_flags; - -/* `TARGET_...' - This series of macros is to allow compiler command arguments to - enable or disable the use of optional features of the target - machine. For example, one machine description serves both the - 68000 and the 68020; a command argument tells the compiler whether - it should use 68020-only instructions or not. This command - argument works by means of a macro `TARGET_68020' that tests a bit - in `target_flags'. - - Define a macro `TARGET_FEATURENAME' for each such option. Its - definition should test a bit in `target_flags'; for example: - - #define TARGET_68020 (target_flags & 1) - - One place where these macros are used is in the - condition-expressions of instruction patterns. Note how - `TARGET_68020' appears frequently in the 68000 machine description - file, `m68k.md'. Another place they are used is in the - definitions of the other macros in the `MACHINE.h' file. */ - - - -#define TARGET_SWITCHES {{"",0, NULL}} -/* This macro defines names of command options to set and clear bits - in `target_flags'. Its definition is an initializer with a - subgrouping for each command option. - - Each subgrouping contains a string constant, that defines the - option name, and a number, which contains the bits to set in - `target_flags'. A negative number says to clear bits instead; the - negative of the number is which bits to clear. The actual option - name is made by appending `-m' to the specified name. - - One of the subgroupings should have a null string. The number in - this grouping is the default value for `target_flags'. Any target - options act starting with that value. - - Here is an example which defines `-m68000' and `-m68020' with - opposite meanings, and picks the latter as the default: - - #define TARGET_SWITCHES \ - { { "68020", 1}, \ - { "68000", -1}, \ - { "", 1}} */ - - -/* This macro is similar to `TARGET_SWITCHES' but defines names of - command options that have values. Its definition is an - initializer with a subgrouping for each command option. - - Each subgrouping contains a string constant, that defines the - fixed part of the option name, and the address of a variable. The - variable, type `char *', is set to the variable part of the given - option if the fixed part matches. The actual option name is made - by appending `-m' to the specified name. - - Here is an example which defines `-mshort-data-NUMBER'. If the - given option is `-mshort-data-512', the variable `m88k_short_data' - will be set to the string `"512"'. - - extern char *m88k_short_data; - #define TARGET_OPTIONS \ - { { "short-data-", &m88k_short_data } } */ - -#define TARGET_VERSION fprintf (stderr, " (ip2k, GNU assembler syntax)") -/* This macro is a C statement to print on `stderr' a string - describing the particular machine description choice. Every - machine description should define `TARGET_VERSION'. For example: - - #ifdef MOTOROLA - #define TARGET_VERSION \ - fprintf (stderr, " (68k, Motorola syntax)") - #else - #define TARGET_VERSION \ - fprintf (stderr, " (68k, MIT syntax)") - #endif */ - -/* Caller-saves is not a win for the IP2K. Pretty much anywhere that - a register is permitted allows SP-relative addresses too. - - This machine doesn't have PIC addressing modes, so disable that also. */ - -#define OVERRIDE_OPTIONS \ - do { \ - flag_caller_saves = 0; \ - flag_pic = 0; \ - } while (0) - -/* `OVERRIDE_OPTIONS' - Sometimes certain combinations of command options do not make - sense on a particular target machine. You can define a macro - `OVERRIDE_OPTIONS' to take account of this. This macro, if - defined, is executed once just after all the command options have - been parsed. - - Don't use this macro to turn on various extra optimizations for - `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */ - -/* Put each function in its own section so that PAGE-instruction - relaxation can do its best. */ -#define OPTIMIZATION_OPTIONS(LEVEL, SIZEFLAG) \ - do { \ - if ((LEVEL) || (SIZEFLAG)) \ - flag_function_sections = 1; \ - } while (0) - -/* Define this if most significant byte of a word is the lowest numbered. */ -#define BITS_BIG_ENDIAN 0 - -/* Define this if most significant byte of a word is the lowest numbered. */ -#define BYTES_BIG_ENDIAN 1 - -/* Define this if most significant word of a multiword number is the lowest - numbered. */ -#define WORDS_BIG_ENDIAN 1 - -/* Number of bits in an addressable storage unit. */ -#define BITS_PER_UNIT 8 - -/* Width in bits of a "word", which is the contents of a machine register. - Note that this is not necessarily the width of data type `int'; */ -#define BITS_PER_WORD 8 - -/* Width of a word, in units (bytes). */ -#define UNITS_PER_WORD (BITS_PER_WORD / BITS_PER_UNIT) - -/* Width in bits of a pointer. - See also the macro `Pmode' defined below. */ -#define POINTER_SIZE 16 - -/* Maximum sized of reasonable data type DImode or Dfmode ... */ -#define MAX_FIXED_MODE_SIZE 64 - -/* Allocation boundary (in *bits*) for storing arguments in argument list. */ -#define PARM_BOUNDARY 8 - -/* Allocation boundary (in *bits*) for the code of a function. */ -#define FUNCTION_BOUNDARY 16 - -/* Alignment of field after `int : 0' in a structure. */ -#define EMPTY_FIELD_BOUNDARY 8 - -/* No data type wants to be aligned rounder than this. */ - -#define BIGGEST_ALIGNMENT 8 - -#define STRICT_ALIGNMENT 0 - -#define PCC_BITFIELD_TYPE_MATTERS 1 - -/* A C expression for the size in bits of the type `int' on the - target machine. If you don't define this, the default is one word. */ -#undef INT_TYPE_SIZE -#define INT_TYPE_SIZE 16 - - -/* A C expression for the size in bits of the type `short' on the - target machine. If you don't define this, the default is half a - word. (If this would be less than one storage unit, it is rounded - up to one unit.) */ -#undef SHORT_TYPE_SIZE -#define SHORT_TYPE_SIZE 16 - -/* A C expression for the size in bits of the type `long' on the - target machine. If you don't define this, the default is one word. */ -#undef LONG_TYPE_SIZE -#define LONG_TYPE_SIZE 32 - - -/* Maximum number for the size in bits of the type `long' on the - target machine. If this is undefined, the default is - `LONG_TYPE_SIZE'. Otherwise, it is the constant value that is the - largest value that `LONG_TYPE_SIZE' can have at run-time. This is - used in `cpp'. */ -#define MAX_LONG_TYPE_SIZE 32 - -/* A C expression for the size in bits of the type `long long' on the - target machine. If you don't define this, the default is two - words. If you want to support GNU Ada on your machine, the value - of macro must be at least 64. */ -#undef LONG_LONG_TYPE_SIZE -#define LONG_LONG_TYPE_SIZE 64 - -#undef CHAR_TYPE_SIZE -#define CHAR_TYPE_SIZE 8 -/* A C expression for the size in bits of the type `char' on the - target machine. If you don't define this, the default is one - quarter of a word. (If this would be less than one storage unit, - it is rounded up to one unit.) */ - -#undef FLOAT_TYPE_SIZE -#define FLOAT_TYPE_SIZE 32 -/* A C expression for the size in bits of the type `float' on the - target machine. If you don't define this, the default is one word. */ - -#undef DOUBLE_TYPE_SIZE -#define DOUBLE_TYPE_SIZE 32 -/* A C expression for the size in bits of the type `double' on the - target machine. If you don't define this, the default is two - words. */ - - -/* A C expression for the size in bits of the type `long double' on - the target machine. If you don't define this, the default is two - words. */ -#undef LONG_DOUBLE_TYPE_SIZE -#define LONG_DOUBLE_TYPE_SIZE 32 - -#define DEFAULT_SIGNED_CHAR 1 -/* An expression whose value is 1 or 0, according to whether the type - `char' should be signed or unsigned by default. The user can - always override this default with the options `-fsigned-char' and - `-funsigned-char'. */ - -/* #define DEFAULT_SHORT_ENUMS 1 - This was the default for the IP2k but gcc has a bug (as of 17th May - 2001) in the way that library calls to the memory checker functions - are issues that screws things up if an enum is not equivalent to - an int. */ -/* `DEFAULT_SHORT_ENUMS' - A C expression to determine whether to give an `enum' type only as - many bytes as it takes to represent the range of possible values - of that type. A nonzero value means to do that; a zero value - means all `enum' types should be allocated like `int'. - - If you don't define the macro, the default is 0. */ - -#define SIZE_TYPE "unsigned int" -/* A C expression for a string describing the name of the data type - to use for size values. The typedef name `size_t' is defined - using the contents of the string. - - The string can contain more than one keyword. If so, separate - them with spaces, and write first any length keyword, then - `unsigned' if appropriate, and finally `int'. The string must - exactly match one of the data type names defined in the function - `init_decl_processing' in the file `c-decl.c'. You may not omit - `int' or change the order--that would cause the compiler to crash - on startup. - - If you don't define this macro, the default is `"long unsigned - int"'. */ - -#define PTRDIFF_TYPE "int" -/* A C expression for a string describing the name of the data type - to use for the result of subtracting two pointers. The typedef - name `ptrdiff_t' is defined using the contents of the string. See - `SIZE_TYPE' above for more information. - - If you don't define this macro, the default is `"long int"'. */ - -#undef WCHAR_TYPE -#define WCHAR_TYPE "int" -#undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE 16 -/* A C expression for the size in bits of the data type for wide - characters. This is used in `cpp', which cannot make use of - `WCHAR_TYPE'. */ - -#define HARD_REG_SIZE (UNITS_PER_WORD) -/* Standard register usage. - - for the IP2K, we are going to have a LOT of registers, but only some of them - are named. */ - -#define FIRST_PSEUDO_REGISTER (0x104) /* Skip over physical regs, VFP, AP. */ - -/* Number of hardware registers known to the compiler. They receive - numbers 0 through `FIRST_PSEUDO_REGISTER-1'; thus, the first - pseudo register's number really is assigned the number - `FIRST_PSEUDO_REGISTER'. */ - -#define REG_IP 0x4 -#define REG_IPH REG_IP -#define REG_IPL 0x5 - -#define REG_SP 0x6 -#define REG_SPH REG_SP -#define REG_SPL 0x7 - -#define REG_PCH 0x8 -#define REG_PCL 0x9 - -#define REG_W 0xa -#define REG_STATUS 0xb - -#define REG_DP 0xc -#define REG_DPH REG_DP -#define REG_DPL 0xd - -#define REG_MULH 0xf - -#define REG_CALLH 0x7e /* Call-stack readout. */ -#define REG_CALLL 0x7f - - -#define REG_RESULT 0x80 /* Result register (upto 8 bytes). */ -#define REG_FP 0xfd /* 2 bytes for FRAME chain */ - -#define REG_ZERO 0xff /* Initialized to zero by runtime. */ - -#define REG_VFP 0x100 /* Virtual frame pointer. */ -#define REG_AP 0x102 /* Virtual arg pointer. */ - -/* Status register bits. */ -#define Z_FLAG 0x2 -#define DC_FLAG 0x1 -#define C_FLAG 0x0 - -#define FIXED_REGISTERS {\ -1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r0.. r31*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r32.. r63*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r64.. r95*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r96..r127*/\ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*r128..r159*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r160..r191*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r192..r223*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r224..r255*/\ -1,1,1,1} - -/* An initializer that says which registers are used for fixed - purposes all throughout the compiled code and are therefore not - available for general allocation. These would include the stack - pointer, the frame pointer (except on machines where that can be - used as a general register when no frame pointer is needed), the - program counter on machines where that is considered one of the - addressable registers, and any other numbered register with a - standard use. - - This information is expressed as a sequence of numbers, separated - by commas and surrounded by braces. The Nth number is 1 if - register N is fixed, 0 otherwise. - - The table initialized from this macro, and the table initialized by - the following one, may be overridden at run time either - automatically, by the actions of the macro - `CONDITIONAL_REGISTER_USAGE', or by the user with the command - options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'. */ - -#define CALL_USED_REGISTERS { \ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r0.. r31*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r32.. r63*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r64.. r95*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/* r96..r127*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r128..r159*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r160..r191*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r192..r223*/\ -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,/*r224..r255*/\ -1,1,1,1} - -/* Like `FIXED_REGISTERS' but has 1 for each register that is - clobbered (in general) by function calls as well as for fixed - registers. This macro therefore identifies the registers that are - not available for general allocation of values that must live - across function calls. - - If a register has 0 in `CALL_USED_REGISTERS', the compiler - automatically saves it on function entry and restores it on - function exit, if the register is used within the function. */ - -#define NON_SAVING_SETJMP 0 -/* If this macro is defined and has a nonzero value, it means that - `setjmp' and related functions fail to save the registers, or that - `longjmp' fails to restore them. To compensate, the compiler - avoids putting variables in registers in functions that use - `setjmp'. */ - -#define REG_ALLOC_ORDER { \ - 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, \ - 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, \ - 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, \ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ - 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, \ - 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, \ - 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, \ - 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, \ - 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, \ - 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, \ - 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, \ - 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, \ - 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, \ - 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, \ - 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, \ - 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff, \ - 0x00,0x01,0x02,0x03,0x0c,0x0d,0x06,0x07, \ - 0x08,0x09,0x0a,0x0b,0x04,0x05,0x0e,0x0f, \ - 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, \ - 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, \ - 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, \ - 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, \ - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, \ - 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, \ - 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, \ - 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, \ - 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, \ - 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, \ - 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, \ - 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, \ - 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, \ - 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, \ - 0x100,0x101,0x102,0x103} - -/* If defined, an initializer for a vector of integers, containing the - numbers of hard registers in the order in which GNU CC should - prefer to use them (from most preferred to least). - - If this macro is not defined, registers are used lowest numbered - first (all else being equal). - - One use of this macro is on machines where the highest numbered - registers must always be saved and the save-multiple-registers - instruction supports only sequences of consecutive registers. On - such machines, define `REG_ALLOC_ORDER' to be an initializer that - lists the highest numbered allocatable register first. */ - -#define ORDER_REGS_FOR_LOCAL_ALLOC ip2k_init_local_alloc (reg_alloc_order) -/* A C statement (sans semicolon) to choose the order in which to - allocate hard registers for pseudo-registers local to a basic - block. - - Store the desired register order in the array `reg_alloc_order'. - Element 0 should be the register to allocate first; element 1, the - next register; and so on. - - The macro body should not assume anything about the contents of - `reg_alloc_order' before execution of the macro. - - On most machines, it is not necessary to define this macro. */ - -/* Are we allowed to rename registers? For some reason, regrename was - changing DP to IP (when it appeared in addresses like (plus:HI - (reg: DP) (const_int 37)) - and that's bad because IP doesn't - permit offsets! */ - -#define HARD_REGNO_RENAME_OK(REG, NREG) \ - (((REG) == REG_DPH) ? 0 \ - : ((REG) == REG_IPH) ? ((NREG) == REG_DPH) \ - : (((NREG) == REG_IPL) || ((NREG) == REG_DPL)) ? 0 : 1) - -#define HARD_REGNO_NREGS(REGNO, MODE) \ - ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) - -/* A C expression for the number of consecutive hard registers, - starting at register number REGNO, required to hold a value of mode - MODE. - - On a machine where all registers are exactly one word, a suitable - definition of this macro is - - #define HARD_REGNO_NREGS(REGNO, MODE) \ - ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ - / UNITS_PER_WORD)) */ - -#define HARD_REGNO_MODE_OK(REGNO, MODE) 1 -/* A C expression that is nonzero if it is permissible to store a - value of mode MODE in hard register number REGNO (or in several - registers starting with that one). For a machine where all - registers are equivalent, a suitable definition is - - #define HARD_REGNO_MODE_OK(REGNO, MODE) 1 - - It is not necessary for this macro to check for the numbers of - fixed registers, because the allocation mechanism considers them - to be always occupied. - - On some machines, double-precision values must be kept in even/odd - register pairs. The way to implement that is to define this macro - to reject odd register numbers for such modes. - - The minimum requirement for a mode to be OK in a register is that - the `movMODE' instruction pattern support moves between the - register and any other hard register for which the mode is OK; and - that moving a value into the register and back out not alter it. - - Since the same instruction used to move `SImode' will work for all - narrower integer modes, it is not necessary on any machine for - `HARD_REGNO_MODE_OK' to distinguish between these modes, provided - you define patterns `movhi', etc., to take advantage of this. This - is useful because of the interaction between `HARD_REGNO_MODE_OK' - and `MODES_TIEABLE_P'; it is very desirable for all integer modes - to be tieable. - - Many machines have special registers for floating point arithmetic. - Often people assume that floating point machine modes are allowed - only in floating point registers. This is not true. Any - registers that can hold integers can safely *hold* a floating - point machine mode, whether or not floating arithmetic can be done - on it in those registers. Integer move instructions can be used - to move the values. - - On some machines, though, the converse is true: fixed-point machine - modes may not go in floating registers. This is true if the - floating registers normalize any value stored in them, because - storing a non-floating value there would garble it. In this case, - `HARD_REGNO_MODE_OK' should reject fixed-point machine modes in - floating registers. But if the floating registers do not - automatically normalize, if you can store any bit pattern in one - and retrieve it unchanged without a trap, then any machine mode - may go in a floating register, so you can define this macro to say - so. - - The primary significance of special floating registers is rather - that they are the registers acceptable in floating point arithmetic - instructions. However, this is of no concern to - `HARD_REGNO_MODE_OK'. You handle it by writing the proper - constraints for those instructions. - - On some machines, the floating registers are especially slow to - access, so that it is better to store a value in a stack frame - than in such a register if floating point arithmetic is not being - done. As long as the floating registers are not in class - `GENERAL_REGS', they will not be used unless some pattern's - constraint asks for one. */ - -#define MODES_TIEABLE_P(MODE1, MODE2) \ - (((MODE1) == QImode && (MODE2) == HImode) \ - || ((MODE2) == QImode && (MODE1) == HImode)) -/* We originally had this as follows - this isn't a win on the IP2k - though as registers just get in our way! - - #define MODES_TIEABLE_P(MODE1, MODE2) \ - (((MODE1) > HImode && (MODE2) == HImode) - || ((MODE1) == HImode && (MODE2) > HImode)) */ - -/* A C expression that is nonzero if it is desirable to choose - register allocation so as to avoid move instructions between a - value of mode MODE1 and a value of mode MODE2. - - If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, - MODE2)' are ever different for any R, then `MODES_TIEABLE_P (MODE1, - MODE2)' must be zero. */ - -enum reg_class { - NO_REGS, - DPH_REGS, - DPL_REGS, - DP_REGS, - SP_REGS, - IPH_REGS, - IPL_REGS, - IP_REGS, - DP_SP_REGS, - PTR_REGS, - NONPTR_REGS, - NONSP_REGS, - GENERAL_REGS, - ALL_REGS = GENERAL_REGS, - LIM_REG_CLASSES -}; - -/* An enumeral type that must be defined with all the register class - names as enumeral values. `NO_REGS' must be first. `ALL_REGS' - must be the last register class, followed by one more enumeral - value, `LIM_REG_CLASSES', which is not a register class but rather - tells how many classes there are. - - Each register class has a number, which is the value of casting - the class name to type `int'. The number serves as an index in - many of the tables described below. */ - - -#define N_REG_CLASSES (int)LIM_REG_CLASSES -/* The number of distinct register classes, defined as follows: - - #define N_REG_CLASSES (int) LIM_REG_CLASSES */ - -#define REG_CLASS_NAMES { \ - "NO_REGS", \ - "DPH_REGS", \ - "DPL_REGS", \ - "DP_REGS", \ - "SP_REGS", \ - "IPH_REGS", \ - "IPL_REGS", \ - "IP_REGS", \ - "DP_SP_REGS", \ - "PTR_REGS", \ - "NONPTR_REGS", \ - "NONSP_REGS", \ - "GENERAL_REGS" \ - } -/* An initializer containing the names of the register classes as C - string constants. These names are used in writing some of the - debugging dumps. */ - - -#define REG_CLASS_CONTENTS { \ -{0x00000000, 0, 0, 0, 0, 0, 0, 0, 0}, /* NO_REGS */ \ -{0x00001000, 0, 0, 0, 0, 0, 0, 0, 0}, /* DPH_REGS */ \ -{0x00002000, 0, 0, 0, 0, 0, 0, 0, 0}, /* DPL_REGS */ \ -{0x00003000, 0, 0, 0, 0, 0, 0, 0, 0}, /* DP_REGS */ \ -{0x000000c0, 0, 0, 0, 0, 0, 0, 0, 0}, /* SP_REGS */ \ -{0x00000010, 0, 0, 0, 0, 0, 0, 0, 0}, /* IPH_REGS */ \ -{0x00000020, 0, 0, 0, 0, 0, 0, 0, 0}, /* IPL_REGS */ \ -{0x00000030, 0, 0, 0, 0, 0, 0, 0, 0}, /* IP_REGS */ \ -{0x000030c0, 0, 0, 0, 0, 0, 0, 0, 0}, /* DP_SP_REGS */ \ -{0x000030f0, 0, 0, 0, 0, 0, 0, 0, 0}, /* PTR_REGS */ \ -{0xffffcf0f,-1,-1,-1,-1,-1,-1,-1, 0}, /* NONPTR_REGS */ \ -{0xffffff3f,-1,-1,-1,-1,-1,-1,-1, 0}, /* NONSP_REGS */ \ -{0xffffffff,-1,-1,-1,-1,-1,-1,-1,15} /* GENERAL_REGS */ \ -} - -/* An initializer containing the contents of the register classes, as - integers which are bit masks. The Nth integer specifies the - contents of class N. The way the integer MASK is interpreted is - that register R is in the class if `MASK & (1 << R)' is 1. - - When the machine has more than 32 registers, an integer does not - suffice. Then the integers are replaced by sub-initializers, - braced groupings containing several integers. Each - sub-initializer must be suitable as an initializer for the type - `HARD_REG_SET' which is defined in `hard-reg-set.h'. */ - -#define REGNO_REG_CLASS(R) \ - ( (R) == REG_IPH ? IPH_REGS \ - : (R) == REG_IPL ? IPL_REGS \ - : (R) == REG_DPH ? DPH_REGS \ - : (R) == REG_DPL ? DPL_REGS \ - : (R) == REG_SPH ? SP_REGS \ - : (R) == REG_SPL ? SP_REGS \ - : NONPTR_REGS) - -/* A C expression whose value is a register class containing hard - register REGNO. In general there is more than one such class; - choose a class which is "minimal", meaning that no smaller class - also contains the register. */ - -#define MODE_BASE_REG_CLASS(MODE) ((MODE) == QImode ? PTR_REGS : DP_SP_REGS) -/* This is a variation of the BASE_REG_CLASS macro which allows - the selection of a base register in a mode depenedent manner. - If MODE is VOIDmode then it should return the same value as - BASE_REG_CLASS. */ - -#define BASE_REG_CLASS PTR_REGS -/* A macro whose definition is the name of the class to which a valid - base register must belong. A base register is one used in an - address which is the register value plus a displacement. */ - -#define INDEX_REG_CLASS NO_REGS -/* A macro whose definition is the name of the class to which a valid - index register must belong. An index register is one used in an - address where its value is either multiplied by a scale factor or - added to another register (as well as added to a displacement). */ - - -#define REG_CLASS_FROM_LETTER(C) \ - ( (C) == 'j' ? IPH_REGS \ - : (C) == 'k' ? IPL_REGS \ - : (C) == 'f' ? IP_REGS \ - : (C) == 'y' ? DPH_REGS \ - : (C) == 'z' ? DPL_REGS \ - : (C) == 'b' ? DP_REGS \ - : (C) == 'u' ? NONSP_REGS \ - : (C) == 'q' ? SP_REGS \ - : (C) == 'c' ? DP_SP_REGS \ - : (C) == 'a' ? PTR_REGS \ - : (C) == 'd' ? NONPTR_REGS \ - : NO_REGS) - -/* A C expression which defines the machine-dependent operand - constraint letters for register classes. If CHAR is such a - letter, the value should be the register class corresponding to - it. Otherwise, the value should be `NO_REGS'. The register - letter `r', corresponding to class `GENERAL_REGS', will not be - passed to this macro; you do not need to handle it. */ - - -#define REGNO_OK_FOR_BASE_P(R) \ - ((R) == REG_DP || (R) == REG_IP || (R) == REG_SP) -/* A C expression which is nonzero if register number R is suitable - for use as a base register in operand addresses. It may be either - a suitable hard register or a pseudo register that has been - allocated such a hard register. */ - -#define REGNO_MODE_OK_FOR_BASE_P(R,M) \ - ((R) == REG_DP || (R) == REG_SP \ - || ((R) == REG_IP && GET_MODE_SIZE (M) <= 1)) -/* A C expression that is just like `REGNO_OK_FOR_BASE_P', except that - that expression may examine the mode of the memory reference in - MODE. You should define this macro if the mode of the memory - reference affects whether a register may be used as a base - register. If you define this macro, the compiler will use it - instead of `REGNO_OK_FOR_BASE_P'. */ - -#define REGNO_OK_FOR_INDEX_P(NUM) 0 -/* A C expression which is nonzero if register number NUM is suitable - for use as an index register in operand addresses. It may be - either a suitable hard register or a pseudo register that has been - allocated such a hard register. - - The difference between an index register and a base register is - that the index register may be scaled. If an address involves the - sum of two registers, neither one of them scaled, then either one - may be labeled the "base" and the other the "index"; but whichever - labeling is used must fit the machine's constraints of which - registers may serve in each capacity. The compiler will try both - labelings, looking for one that is valid, and will reload one or - both registers only if neither labeling works. */ - -#define PREFERRED_RELOAD_CLASS(X, CLASS) (CLASS) -/* A C expression that places additional restrictions on the register - class to use when it is necessary to copy value X into a register - in class CLASS. The value is a register class; perhaps CLASS, or - perhaps another, smaller class. On many machines, the following - definition is safe: - - #define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS) - - Sometimes returning a more restrictive class makes better code. - For example, on the 68000, when X is an integer constant that is - in range for a `moveq' instruction, the value of this macro is - always `DATA_REGS' as long as CLASS includes the data registers. - Requiring a data register guarantees that a `moveq' will be used. - - If X is a `const_double', by returning `NO_REGS' you can force X - into a memory constant. This is useful on certain machines where - immediate floating values cannot be loaded into certain kinds of - registers. */ - -/* `PREFERRED_OUTPUT_RELOAD_CLASS (X, CLASS)' - Like `PREFERRED_RELOAD_CLASS', but for output reloads instead of - input reloads. If you don't define this macro, the default is to - use CLASS, unchanged. */ - -/* `LIMIT_RELOAD_CLASS (MODE, CLASS)' - A C expression that places additional restrictions on the register - class to use when it is necessary to be able to hold a value of - mode MODE in a reload register for which class CLASS would - ordinarily be used. - - Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when - there are certain modes that simply can't go in certain reload - classes. - - The value is a register class; perhaps CLASS, or perhaps another, - smaller class. - - Don't define this macro unless the target machine has limitations - which require the macro to do something nontrivial. */ - -/* SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) - `SECONDARY_RELOAD_CLASS (CLASS, MODE, X)' - `SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X)' - Many machines have some registers that cannot be copied directly - to or from memory or even from other types of registers. An - example is the `MQ' register, which on most machines, can only be - copied to or from general registers, but not memory. Some - machines allow copying all registers to and from memory, but - require a scratch register for stores to some memory locations - (e.g., those with symbolic address on the RT, and those with - certain symbolic address on the Sparc when compiling PIC). In - some cases, both an intermediate and a scratch register are - required. - - You should define these macros to indicate to the reload phase - that it may need to allocate at least one register for a reload in - addition to the register to contain the data. Specifically, if - copying X to a register CLASS in MODE requires an intermediate - register, you should define `SECONDARY_INPUT_RELOAD_CLASS' to - return the largest register class all of whose registers can be - used as intermediate registers or scratch registers. - - If copying a register CLASS in MODE to X requires an intermediate - or scratch register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be - defined to return the largest register class required. If the - requirements for input and output reloads are the same, the macro - `SECONDARY_RELOAD_CLASS' should be used instead of defining both - macros identically. - - The values returned by these macros are often `GENERAL_REGS'. - Return `NO_REGS' if no spare register is needed; i.e., if X can be - directly copied to or from a register of CLASS in MODE without - requiring a scratch register. Do not define this macro if it - would always return `NO_REGS'. - - If a scratch register is required (either with or without an - intermediate register), you should define patterns for - `reload_inM' or `reload_outM', as required (*note Standard - Names::.. These patterns, which will normally be implemented with - a `define_expand', should be similar to the `movM' patterns, - except that operand 2 is the scratch register. - - Define constraints for the reload register and scratch register - that contain a single register class. If the original reload - register (whose class is CLASS) can meet the constraint given in - the pattern, the value returned by these macros is used for the - class of the scratch register. Otherwise, two additional reload - registers are required. Their classes are obtained from the - constraints in the insn pattern. - - X might be a pseudo-register or a `subreg' of a pseudo-register, - which could either be in a hard register or in memory. Use - `true_regnum' to find out; it will return -1 if the pseudo is in - memory and the hard register number if it is in a register. - - These macros should not be used in the case where a particular - class of registers can only be copied to memory and not to another - class of registers. In that case, secondary reload registers are - not needed and would not be helpful. Instead, a stack location - must be used to perform the copy and the `movM' pattern should use - memory as a intermediate storage. This case often occurs between - floating-point and general registers. */ - -/* `SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)' - Certain machines have the property that some registers cannot be - copied to some other registers without using memory. Define this - macro on those machines to be a C expression that is non-zero if - objects of mode M in registers of CLASS1 can only be copied to - registers of class CLASS2 by storing a register of CLASS1 into - memory and loading that memory location into a register of CLASS2. - - Do not define this macro if its value would always be zero. - - `SECONDARY_MEMORY_NEEDED_RTX (MODE)' - Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler - allocates a stack slot for a memory location needed for register - copies. If this macro is defined, the compiler instead uses the - memory location defined by this macro. - - Do not define this macro if you do not define - `SECONDARY_MEMORY_NEEDED'. */ - -#define SMALL_REGISTER_CLASSES 1 -/* Normally the compiler avoids choosing registers that have been - explicitly mentioned in the rtl as spill registers (these - registers are normally those used to pass parameters and return - values). However, some machines have so few registers of certain - classes that there would not be enough registers to use as spill - registers if this were done. - - Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero - value on these machines. When this macro has a non-zero value, the - compiler allows registers explicitly used in the rtl to be used as - spill registers but avoids extending the lifetime of these - registers. - - It is always safe to define this macro with a non-zero value, but - if you unnecessarily define it, you will reduce the amount of - optimizations that can be performed in some cases. If you do not - define this macro with a non-zero value when it is required, the - compiler will run out of spill registers and print a fatal error - message. For most machines, you should not define this macro at - all. */ - -#define CLASS_LIKELY_SPILLED_P(CLASS) class_likely_spilled_p(CLASS) -/* A C expression whose value is nonzero if pseudos that have been - assigned to registers of class CLASS would likely be spilled - because registers of CLASS are needed for spill registers. - - The default value of this macro returns 1 if CLASS has exactly one - register and zero otherwise. On most machines, this default - should be used. Only define this macro to some other expression - if pseudo allocated by `local-alloc.c' end up in memory because - their hard registers were needed for spill registers. If this - macro returns nonzero for those classes, those pseudos will only - be allocated by `global.c', which knows how to reallocate the - pseudo to another register. If there would not be another - register available for reallocation, you should not change the - definition of this macro since the only effect of such a - definition would be to slow down register allocation. */ - -#define CLASS_MAX_NREGS(CLASS, MODE) GET_MODE_SIZE (MODE) -/* A C expression for the maximum number of consecutive registers of - class CLASS needed to hold a value of mode MODE. - - This is closely related to the macro `HARD_REGNO_NREGS'. In fact, - the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be - the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all - REGNO values in the class CLASS. - - This macro helps control the handling of multiple-word values in - the reload pass. */ - -#define CONST_OK_FOR_LETTER_P(VALUE, C) \ - ((C) == 'I' ? (VALUE) >= -255 && (VALUE) <= -1 : \ - (C) == 'J' ? (VALUE) >= 0 && (VALUE) <= 7 : \ - (C) == 'K' ? (VALUE) >= 0 && (VALUE) <= 127 : \ - (C) == 'L' ? (VALUE) > 0 && (VALUE) < 128: \ - (C) == 'M' ? (VALUE) == -1: \ - (C) == 'N' ? (VALUE) == 1: \ - (C) == 'O' ? (VALUE) == 0: \ - (C) == 'P' ? (VALUE) >= 0 && (VALUE) <= 255: \ - 0) - -/* A C expression that defines the machine-dependent operand - constraint letters (`I', `J', `K', ... `P') that specify - particular ranges of integer values. If C is one of those - letters, the expression should check that VALUE, an integer, is in - the appropriate range and return 1 if so, 0 otherwise. If C is - not one of those letters, the value should be 0 regardless of - VALUE. */ - -#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) 0 - -/* `CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)' - A C expression that defines the machine-dependent operand - constraint letters that specify particular ranges of - `const_double' values (`G' or `H'). - - If C is one of those letters, the expression should check that - VALUE, an RTX of code `const_double', is in the appropriate range - and return 1 if so, 0 otherwise. If C is not one of those - letters, the value should be 0 regardless of VALUE. - - `const_double' is used for all floating-point constants and for - `DImode' fixed-point constants. A given letter can accept either - or both kinds of values. It can use `GET_MODE' to distinguish - between these kinds. */ - -#define EXTRA_CONSTRAINT(X, C) ip2k_extra_constraint (X, C) - -/* A C expression that defines the optional machine-dependent - constraint letters (``Q', `R', `S', `T', `U') that can' - be used to segregate specific types of operands, usually memory - references, for the target machine. Normally this macro will not - be defined. If it is required for a particular target machine, it - should return 1 if VALUE corresponds to the operand type - represented by the constraint letter C. If C is not defined as an - extra constraint, the value returned should be 0 regardless of - VALUE. - - For example, on the ROMP, load instructions cannot have their - output in r0 if the memory reference contains a symbolic address. - Constraint letter `Q' is defined as representing a memory address - that does *not* contain a symbolic address. An alternative is - specified with a `Q' constraint on the input and `r' on the - output. The next alternative specifies `m' on the input and a - register class that does not include r0 on the output. */ - -/* This is an undocumented variable which describes - how GCC will pop a data. */ -#define STACK_POP_CODE PRE_INC - -#define STACK_PUSH_CODE POST_DEC -/* This macro defines the operation used when something is pushed on - the stack. In RTL, a push operation will be `(set (mem - (STACK_PUSH_CODE (reg sp))) ...)' - - The choices are `PRE_DEC', `POST_DEC', `PRE_INC', and `POST_INC'. - Which of these is correct depends on the stack direction and on - whether the stack pointer points to the last item on the stack or - whether it points to the space for the next item on the stack. - - The default is `PRE_DEC' when `STACK_GROWS_DOWNWARD' is defined, - which is almost always right, and `PRE_INC' otherwise, which is - often wrong. */ - - -#define STACK_CHECK_BUILTIN 1 -/* Prologue code will do stack checking as necessary. */ - -#define STARTING_FRAME_OFFSET (0) -/* Offset from the frame pointer to the first local variable slot to - be allocated. - - If `FRAME_GROWS_DOWNWARD', find the next slot's offset by - subtracting the first slot's length from `STARTING_FRAME_OFFSET'. - Otherwise, it is found by adding the length of the first slot to - the value `STARTING_FRAME_OFFSET'. */ - -#define FRAME_GROWS_DOWNWARD 1 -#define STACK_GROWS_DOWNWARD 1 - -/* On IP2K arg pointer is virtual and resolves to either SP or FP - after we've resolved what registers are saved (fp chain, return - pc, etc. */ - -#define FIRST_PARM_OFFSET(FUNDECL) 0 -/* Offset from the argument pointer register to the first argument's - address. On some machines it may depend on the data type of the - function. - - If `ARGS_GROW_DOWNWARD', this is the offset to the location above - the first argument's address. */ - -/* `STACK_DYNAMIC_OFFSET (FUNDECL)' - Offset from the stack pointer register to an item dynamically - allocated on the stack, e.g., by `alloca'. - - The default value for this macro is `STACK_POINTER_OFFSET' plus the - length of the outgoing arguments. The default is correct for most - machines. See `function.c' for details. */ - -#define STACK_POINTER_OFFSET 1 -/* IP2K stack is post-decremented, so 0(sp) is address of open space - and 1(sp) is offset to the location avobe the forst location at which - outgoing arguments are placed. */ - -#define STACK_BOUNDARY 8 -/* Define this macro if there is a guaranteed alignment for the stack - pointer on this machine. The definition is a C expression for the - desired alignment (measured in bits). This value is used as a - default if PREFERRED_STACK_BOUNDARY is not defined. */ - -#define STACK_POINTER_REGNUM REG_SP -/* The register number of the stack pointer register, which must also - be a fixed register according to `FIXED_REGISTERS'. On most - machines, the hardware determines which register this is. */ - -#define FRAME_POINTER_REGNUM REG_VFP -/* The register number of the frame pointer register, which is used to - access automatic variables in the stack frame. On some machines, - the hardware determines which register this is. On other - machines, you can choose any register you wish for this purpose. */ - -#define HARD_FRAME_POINTER_REGNUM REG_FP - -#define ARG_POINTER_REGNUM REG_AP -/* The register number of the arg pointer register, which is used to - access the function's argument list. On some machines, this is - the same as the frame pointer register. On some machines, the - hardware determines which register this is. On other machines, - you can choose any register you wish for this purpose. If this is - not the same register as the frame pointer register, then you must - mark it as a fixed register according to `FIXED_REGISTERS', or - arrange to be able to eliminate it (*note Elimination::.). */ - -/* We don't really want to support nested functions. But we'll crash - in various testsuite tests if we don't at least define the register - to contain the static chain. The return value register is about as - bad a place as any for this. */ - -#define STATIC_CHAIN_REGNUM REG_RESULT -/* Register numbers used for passing a function's static chain - pointer. If register windows are used, the register number as - seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM', - while the register number as seen by the calling function is - `STATIC_CHAIN_REGNUM'. If these registers are the same, - `STATIC_CHAIN_INCOMING_REGNUM' need not be defined. - - The static chain register need not be a fixed register. - - If the static chain is passed in memory, these macros should not be - defined; instead, the next two macros should be defined. */ - -#define FRAME_POINTER_REQUIRED (!flag_omit_frame_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. - - The expression can in principle examine the current function and - decide according to the facts, but on most machines the constant 0 - or the constant 1 suffices. Use 0 when the machine allows code to - be generated with no frame pointer, and doing so saves some time - or space. Use 1 when there is no possible advantage to avoiding a - frame pointer. - - In certain cases, the compiler does not know how to produce valid - code without a frame pointer. The compiler recognizes those cases - and automatically gives the function a frame pointer regardless of - what `FRAME_POINTER_REQUIRED' says. You don't need to worry about - them. - - In a function that does not require a frame pointer, the frame - pointer register can be allocated for ordinary usage, unless you - mark it as a fixed register. See `FIXED_REGISTERS' for more - information. */ - -#define ELIMINABLE_REGS { \ - {ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ - {ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ - {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ - {FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ - {HARD_FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ -} -/* If defined, this macro specifies a table of register pairs used to - eliminate unneeded registers that point into the stack frame. If - it is not defined, the only elimination attempted by the compiler - is to replace references to the frame pointer with references to - the stack pointer. - - The definition of this macro is a list of structure - initializations, each of which specifies an original and - replacement register. - - On some machines, the position of the argument pointer is not - known until the compilation is completed. In such a case, a - separate hard register must be used for the argument pointer. - This register can be eliminated by replacing it with either the - frame pointer or the argument pointer, depending on whether or not - the frame pointer has been eliminated. - - In this case, you might specify: - #define ELIMINABLE_REGS \ - {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ - {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ - {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} - - Note that the elimination of the argument pointer with the stack - pointer is specified first since that is the preferred elimination. */ - - -#define CAN_ELIMINATE(FROM, TO) \ - ((FROM) == HARD_FRAME_POINTER_REGNUM \ - ? (flag_omit_frame_pointer && !frame_pointer_needed) : 1) -/* Don't eliminate FP unless we EXPLICITLY_ASKED */ - -/* A C expression that returns non-zero if the compiler is allowed to - try to replace register number FROM-REG with register number - TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is - defined, and will usually be the constant 1, since most of the - cases preventing register elimination are things that the compiler - already knows about. */ - -#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ - ((OFFSET) = ip2k_init_elim_offset ((FROM), (TO))) - -/* 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 - defined. */ - -#define RETURN_ADDR_RTX(COUNT, X) \ - (((COUNT) == 0) ? gen_rtx_REG (HImode, REG_CALLH) : NULL_RTX) -/* A C expression whose value is RTL representing the value of the - return address for the frame COUNT steps up from the current - frame, after the prologue. FRAMEADDR is the frame pointer of the - COUNT frame, or the frame pointer of the COUNT - 1 frame if - `RETURN_ADDR_IN_PREVIOUS_FRAME' is defined. - - The value of the expression must always be the correct address when - COUNT is zero, but may be `NULL_RTX' if there is not way to - determine the return address of other frames. */ - -#define PUSH_ROUNDING(NPUSHED) (NPUSHED) -/* A C expression that is the number of bytes actually pushed onto the - stack when an instruction attempts to push NPUSHED bytes. - - If the target machine does not have a push instruction, do not - define this macro. That directs GNU CC to use an alternate - strategy: to allocate the entire argument block and then store the - arguments into it. - - On some machines, the definition - - #define PUSH_ROUNDING(BYTES) (BYTES) - - will suffice. But on other machines, instructions that appear to - push one byte actually push two bytes in an attempt to maintain - alignment. Then the definition should be - - #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) */ - -#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ - ip2k_return_pops_args ((FUNDECL), (FUNTYPE), (SIZE)) -/* A C expression that should indicate the number of bytes of its own - arguments that a function pops on returning, or 0 if the function - pops no arguments and the caller must therefore pop them all after - the function returns. - - FUNDECL is a C variable whose value is a tree node that describes - the function in question. Normally it is a node of type - `FUNCTION_DECL' that describes the declaration of the function. - From this you can obtain the DECL_MACHINE_ATTRIBUTES of the - function. - - FUNTYPE is a C variable whose value is a tree node that describes - the function in question. Normally it is a node of type - `FUNCTION_TYPE' that describes the data type of the function. - From this it is possible to obtain the data types of the value and - arguments (if known). - - When a call to a library function is being considered, FUNDECL - will contain an identifier node for the library function. Thus, if - you need to distinguish among various library functions, you can - do so by their names. Note that "library function" in this - context means a function used to perform arithmetic, whose name is - known specially in the compiler and was not mentioned in the C - code being compiled. - - STACK-SIZE is the number of bytes of arguments passed on the - stack. If a variable number of bytes is passed, it is zero, and - argument popping will always be the responsibility of the calling - function. - - On the Vax, all functions always pop their arguments, so the - definition of this macro is STACK-SIZE. On the 68000, using the - standard calling convention, no functions pop their arguments, so - the value of the macro is always 0 in this case. But an - alternative calling convention is available in which functions - that take a fixed number of arguments pop them but other functions - (such as `printf') pop nothing (the caller pops all). When this - convention is in use, FUNTYPE is examined to determine whether a - function takes a fixed number of arguments. */ - -#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) 0 -/* A C expression that controls whether a function argument is passed - in a register, and which register. - - The arguments are CUM, which summarizes all the previous - arguments; MODE, the machine mode of the argument; TYPE, the data - type of the argument as a tree node or 0 if that is not known - (which happens for C support library functions); and NAMED, which - is 1 for an ordinary argument and 0 for nameless arguments that - correspond to `...' in the called function's prototype. - - The value of the expression is usually either a `reg' RTX for the - hard register in which to pass the argument, or zero to pass the - argument on the stack. - - For machines like the Vax and 68000, where normally all arguments - are pushed, zero suffices as a definition. - - The value of the expression can also be a `parallel' RTX. This is - used when an argument is passed in multiple locations. The mode - of the of the `parallel' should be the mode of the entire - argument. The `parallel' holds any number of `expr_list' pairs; - each one describes where part of the argument is passed. In each - `expr_list', the first operand can be either a `reg' RTX for the - hard register in which to pass this part of the argument, or zero - to pass the argument on the stack. If this operand is a `reg', - then the mode indicates how large this part of the argument is. - The second operand of the `expr_list' is a `const_int' which gives - the offset in bytes into the entire argument where this part - starts. - - The usual way to make the ANSI library `stdarg.h' work on a machine - where some arguments are usually passed in registers, is to cause - nameless arguments to be passed on the stack instead. This is done - by making `FUNCTION_ARG' return 0 whenever NAMED is 0. - - You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the - definition of this macro to determine if this argument is of a - type that must be passed in the stack. If `REG_PARM_STACK_SPACE' - is not defined and `FUNCTION_ARG' returns non-zero for such an - argument, the compiler will abort. If `REG_PARM_STACK_SPACE' is - defined, the argument will be computed in the stack and then - loaded into a register. */ - -#define CUMULATIVE_ARGS int - -/* A C type for declaring a variable that is used as the first - argument of `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. - - There is no need to record in `CUMULATIVE_ARGS' anything about the - arguments that have been passed on the stack. The compiler has - other variables to keep track of that. For target machines on - which all arguments are passed on the stack, there is no need to - store anything in `CUMULATIVE_ARGS'; however, the data structure - must exist and should not be empty, so use `int'. */ - -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ - ((CUM) = 0) - -/* A C statement (sans semicolon) for initializing the variable CUM - for the state at the beginning of the argument list. The variable - has type `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node - for the data type of the function which will receive the args, or 0 - if the args are to a compiler support library function. The value - of INDIRECT is nonzero when processing an indirect call, for - example a call through a function pointer. The value of INDIRECT - is zero for a call to an explicitly named function, a library - function call, or when `INIT_CUMULATIVE_ARGS' is used to find - arguments for the function being compiled. - - When processing a call to a compiler support library function, - LIBNAME identifies which one. It is a `symbol_ref' rtx which - contains the name of the function, as a string. LIBNAME is 0 when - an ordinary C function call is being processed. Thus, each time - this macro is called, either LIBNAME or FNTYPE is nonzero, but - never both of them at once. */ - -#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) - -/* All arguments are passed on stack - do nothing here. */ - -/* A C statement (sans semicolon) to update the summarizer variable - CUM to advance past an argument in the argument list. The values - MODE, TYPE and NAMED describe that argument. Once this is done, - the variable CUM is suitable for analyzing the *following* - argument with `FUNCTION_ARG', etc. - - This macro need not do anything if the argument in question was - passed on the stack. The compiler knows how to track the amount - of stack space used for arguments without any special help. */ - -#define FUNCTION_ARG_REGNO_P(R) 0 -/* A C expression that is nonzero if REGNO is the number of a hard - register in which function arguments are sometimes passed. This - does *not* include implicit arguments such as the static chain and - the structure-value address. On many machines, no registers can be - used for this purpose since all function arguments are pushed on - the stack. */ - -#define FUNCTION_VALUE(VALTYPE, FUNC) \ - ((TYPE_MODE (VALTYPE) == QImode) \ - ? gen_rtx_REG (TYPE_MODE (VALTYPE), REG_RESULT + 1) \ - : gen_rtx_REG (TYPE_MODE (VALTYPE), REG_RESULT)) - -/* Because functions returning 'char' actually widen to 'int', we have to - use $81 as the return location if we think we only have a 'char'. */ - -/* A C expression to create an RTX representing the place where a - function returns a value of data type VALTYPE. VALTYPE is a tree - node representing a data type. Write `TYPE_MODE (VALTYPE)' to get - the machine mode used to represent that type. On many machines, - only the mode is relevant. (Actually, on most machines, scalar - values are returned in the same place regardless of mode). - - The value of the expression is usually a `reg' RTX for the hard - register where the return value is stored. The value can also be a - `parallel' RTX, if the return value is in multiple places. See - `FUNCTION_ARG' for an explanation of the `parallel' form. - - If `PROMOTE_FUNCTION_RETURN' is defined, you must apply the same - promotion rules specified in `PROMOTE_MODE' if VALTYPE is a scalar - type. - - If the precise function being called is known, FUNC is a tree node - (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This - makes it possible to use a different value-returning convention - for specific functions when all their calls are known. - - `FUNCTION_VALUE' is not used for return vales with aggregate data - types, because these are returned in another way. See - `STRUCT_VALUE_REGNUM' and related macros, below. */ - -#define LIBCALL_VALUE(MODE) gen_rtx_REG ((MODE), REG_RESULT) -/* A C expression to create an RTX representing the place where a - library function returns a value of mode MODE. If the precise - function being called is known, FUNC is a tree node - (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This - makes it possible to use a different value-returning convention - for specific functions when all their calls are known. - - Note that "library function" in this context means a compiler - support routine, used to perform arithmetic, whose name is known - specially by the compiler and was not mentioned in the C code being - compiled. - - The definition of `LIBRARY_VALUE' need not be concerned aggregate - data types, because none of the library functions returns such - types. */ - -#define FUNCTION_VALUE_REGNO_P(N) ((N) == REG_RESULT) -/* A C expression that is nonzero if REGNO is the number of a hard - register in which the values of called function may come back. - - A register whose use for returning values is limited to serving as - the second of a pair (for a value of type `double', say) need not - be recognized by this macro. So for most machines, this definition - suffices: - - #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) - - If the machine has register windows, so that the caller and the - called function use different registers for the return value, this - macro should recognize only the caller's register numbers. */ - -#define RETURN_IN_MEMORY(TYPE) \ - ((TYPE_MODE (TYPE) == BLKmode) ? int_size_in_bytes (TYPE) > 8 : 0) -/* A C expression which can inhibit the returning of certain function - values in registers, based on the type of value. A nonzero value - says to return the function value in memory, just as large - structures are always returned. Here TYPE will be a C expression - of type `tree', representing the data type of the value. - - Note that values of mode `BLKmode' must be explicitly handled by - this macro. Also, the option `-fpcc-struct-return' takes effect - regardless of this macro. On most systems, it is possible to - leave the macro undefined; this causes a default definition to be - used, whose value is the constant 1 for `BLKmode' values, and 0 - otherwise. - - Do not use this macro to indicate that structures and unions - should always be returned in memory. You should instead use - `DEFAULT_PCC_STRUCT_RETURN' to indicate this. */ - -/* Indicate that large structures are passed by reference. */ -#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM,MODE,TYPE,NAMED) 0 - - -#define DEFAULT_PCC_STRUCT_RETURN 0 -/* Define this macro to be 1 if all structure and union return values - must be in memory. Since this results in slower code, this should - be defined only if needed for compatibility with other compilers - or with an ABI. If you define this macro to be 0, then the - conventions used for structure and union return values are decided - by the `RETURN_IN_MEMORY' macro. - - If not defined, this defaults to the value 1. */ - -#define STRUCT_VALUE 0 -/* If the structure value address is not passed in a register, define - `STRUCT_VALUE' as an expression returning an RTX for the place - where the address is passed. If it returns 0, the address is - passed as an "invisible" first argument. */ - -#define STRUCT_VALUE_INCOMING 0 -/* If the incoming location is not a register, then you should define - `STRUCT_VALUE_INCOMING' as an expression for an RTX for where the - called function should find the value. If it should find the - value on the stack, define this to create a `mem' which refers to - the frame pointer. A definition of 0 means that the address is - passed as an "invisible" first argument. */ - -#define EPILOGUE_USES(REGNO) 0 -/* Define this macro as a C expression that is nonzero for registers - are used by the epilogue or the `return' pattern. The stack and - frame pointer registers are already be assumed to be used as - needed. */ - -#define SETUP_INCOMING_VARARGS(ARGS_SO_FAR,MODE,TYPE, \ - PRETEND_ARGS_SIZE,SECOND_TIME) \ - ((PRETEND_ARGS_SIZE) = (0)) - - -/* Hmmm. We don't actually like constants as addresses - they always need - to be loaded to a register, except for function calls which take an - address by immediate value. But changing this to zero had negative - effects, causing the compiler to get very confused.... */ - -#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X) - -/* A C expression that is 1 if the RTX X is a constant which is a - valid address. On most machines, this can be defined as - `CONSTANT_P (X)', but a few machines are more restrictive in which - constant addresses are supported. - - `CONSTANT_P' accepts integer-values expressions whose values are - not explicitly known, such as `symbol_ref', `label_ref', and - `high' expressions and `const' arithmetic expressions, in addition - to `const_int' and `const_double' expressions. */ - -#define MAX_REGS_PER_ADDRESS 1 -/* 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' - would ever accept. */ - -#ifdef REG_OK_STRICT -# define GO_IF_LEGITIMATE_ADDRESS(MODE, OPERAND, ADDR) \ -{ \ - if (legitimate_address_p ((MODE), (OPERAND), 1)) \ - goto ADDR; \ -} -#else -# define GO_IF_LEGITIMATE_ADDRESS(MODE, OPERAND, ADDR) \ -{ \ - if (legitimate_address_p ((MODE), (OPERAND), 0)) \ - goto ADDR; \ -} -#endif -/* A C compound statement with a conditional `goto LABEL;' executed - if X (an RTX) is a legitimate memory address on the target machine - for a memory operand of mode MODE. - - It usually pays to define several simpler macros to serve as - subroutines for this one. Otherwise it may be too complicated to - understand. - - This macro must exist in two variants: a strict variant and a - non-strict one. The strict variant is used in the reload pass. It - must be defined so that any pseudo-register that has not been - allocated a hard register is considered a memory reference. In - contexts where some kind of register is required, a pseudo-register - with no hard register must be rejected. - - The non-strict variant is used in other passes. It must be - defined to accept all pseudo-registers in every context where some - kind of register is required. - - Compiler source files that want to use the strict variant of this - macro define the macro `REG_OK_STRICT'. You should use an `#ifdef - REG_OK_STRICT' conditional to define the strict variant in that - case and the non-strict variant otherwise. - - Subroutines to check for acceptable registers for various purposes - (one for base registers, one for index registers, and so on) are - typically among the subroutines used to define - `GO_IF_LEGITIMATE_ADDRESS'. Then only these subroutine macros - need have two variants; the higher levels of macros may be the - same whether strict or not. - - Normally, constant addresses which are the sum of a `symbol_ref' - and an integer are stored inside a `const' RTX to mark them as - constant. Therefore, there is no need to recognize such sums - specifically as legitimate addresses. Normally you would simply - recognize any `const' as legitimate. - - Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant - sums that are not marked with `const'. It assumes that a naked - `plus' indicates indexing. If so, then you *must* reject such - naked constant sums as illegitimate addresses, so that none of - them will be given to `PRINT_OPERAND_ADDRESS'. - - On some machines, whether a symbolic address is legitimate depends - on the section that the address refers to. On these machines, - define the macro `ENCODE_SECTION_INFO' to store the information - into the `symbol_ref', and then check for it here. When you see a - `const', you will have to look inside it to find the `symbol_ref' - in order to determine the section. *Note Assembler Format::. - - The best way to modify the name string is by adding text to the - beginning, with suitable punctuation to prevent any ambiguity. - Allocate the new name in `saveable_obstack'. You will have to - modify `ASM_OUTPUT_LABELREF' to remove and decode the added text - and output the name accordingly, and define `STRIP_NAME_ENCODING' - to access the original name string. - - You can check the information stored here into the `symbol_ref' in - the definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and - `PRINT_OPERAND_ADDRESS'. */ - -/* A C expression that is nonzero if X (assumed to be a `reg' RTX) is - valid for use as a base register. For hard registers, it should - always accept those which the hardware permits and reject the - others. Whether the macro accepts or rejects pseudo registers - must be controlled by `REG_OK_STRICT' as described above. This - usually requires two variant definitions, of which `REG_OK_STRICT' - controls the one actually used. */ - -#define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) - -#define REG_OK_FOR_BASE_NOSTRICT_P(X) \ - (REGNO (X) >= FIRST_PSEUDO_REGISTER \ - || (REGNO (X) == REG_FP) \ - || (REGNO (X) == REG_VFP) \ - || (REGNO (X) == REG_AP) \ - || REG_OK_FOR_BASE_STRICT_P(X)) - -#ifdef REG_OK_STRICT -# define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X) -#else -# define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NOSTRICT_P (X) -#endif - -#define REG_OK_FOR_INDEX_P(X) 0 -/* A C expression that is nonzero if X (assumed to be a `reg' RTX) is - valid for use as an index register. - - The difference between an index register and a base register is - that the index register may be scaled. If an address involves the - sum of two registers, neither one of them scaled, then either one - may be labeled the "base" and the other the "index"; but whichever - labeling is used must fit the machine's constraints of which - registers may serve in each capacity. The compiler will try both - labelings, looking for one that is valid, and will reload one or - both registers only if neither labeling works. */ - - -/* A C compound statement that attempts to replace X with a valid - memory address for an operand of mode MODE. WIN will be a C - statement label elsewhere in the code; the macro definition may use - - GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); - - to avoid further processing if the address has become legitimate. - - X will always be the result of a call to `break_out_memory_refs', - and OLDX will be the operand that was given to that function to - produce X. - - The code generated by this macro should not alter the substructure - of X. If it transforms X into a more legitimate form, it should - assign X (which will always be a C variable) a new value. - - It is not necessary for this macro to come up with a legitimate - address. The compiler has standard ways of doing so in all cases. - In fact, it is safe for this macro to do nothing. But often a - machine-dependent strategy can generate better code. */ - -#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \ -do { rtx orig_x = (X); \ - (X) = legitimize_address ((X), (OLDX), (MODE), 0); \ - if ((X) != orig_x && memory_address_p ((MODE), (X))) \ - goto WIN; \ -} while (0) - -/* Is X a legitimate register to reload, or is it a pseudo stack-temp - that is problematic for push_reload() ? */ - -#define LRA_REG(X) \ - (! (reg_equiv_memory_loc[REGNO (X)] \ - && (reg_equiv_address[REGNO (X)] \ - || num_not_at_initial_offset))) - -/* Given a register X that failed the LRA_REG test, replace X - by its memory equivalent, find the reloads needed for THAT memory - location and substitute that back for the higher-level reload - that we're conducting... */ - -/* WARNING: we reference 'ind_levels' and 'insn' which are local variables - in find_reloads_address (), where the LEGITIMIZE_RELOAD_ADDRESS macro - expands. */ - -#define FRA_REG(X,MODE,OPNUM,TYPE) \ -do { \ - rtx tem = make_memloc ((X), REGNO (X)); \ - \ - if (! strict_memory_address_p (GET_MODE (tem), XEXP (tem, 0))) \ - { \ - /* Note that we're doing address in address - cf. ADDR_TYPE */ \ - find_reloads_address (GET_MODE (tem), &tem, XEXP (tem, 0), \ - &XEXP (tem, 0), (OPNUM), \ - ADDR_TYPE (TYPE), ind_levels, insn); \ - } \ - (X) = tem; \ -} while (0) - - -/* For the IP2K, we want to be clever about picking IP vs DP for a - base pointer since IP only directly supports a zero displacement. - (Note that we have modified all the HI patterns to correctly handle - IP references by manipulating iph:ipl as we fetch the pieces). */ -#define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND,WIN) \ -{ \ - if (GET_CODE (X) == PLUS \ - && REG_P (XEXP (X, 0)) \ - && GET_CODE (XEXP (X, 1)) == CONST_INT) \ - { \ - int disp = INTVAL (XEXP (X, 1)); \ - int fit = (disp >= 0 && disp <= (127 - 2 * GET_MODE_SIZE (MODE))); \ - rtx reg = XEXP (X, 0); \ - if (!fit) \ - { \ - push_reload ((X), NULL_RTX, &(X), \ - NULL, MODE_BASE_REG_CLASS (MODE), GET_MODE (X), \ - VOIDmode, 0, 0, OPNUM, TYPE); \ - goto WIN; \ - } \ - if (reg_equiv_memory_loc[REGNO (reg)] \ - && (reg_equiv_address[REGNO (reg)] || num_not_at_initial_offset)) \ - { \ - rtx mem = make_memloc (reg, REGNO (reg)); \ - if (! strict_memory_address_p (GET_MODE (mem), XEXP (mem, 0))) \ - { \ - /* Note that we're doing address in address - cf. ADDR_TYPE */\ - find_reloads_address (GET_MODE (mem), &mem, XEXP (mem, 0), \ - &XEXP (mem, 0), (OPNUM), \ - ADDR_TYPE (TYPE), (IND), insn); \ - } \ - push_reload (mem, NULL, &XEXP (X, 0), NULL, \ - GENERAL_REGS, Pmode, VOIDmode, 0, 0, \ - OPNUM, TYPE); \ - push_reload (X, NULL, &X, NULL, \ - MODE_BASE_REG_CLASS (MODE), GET_MODE (X), VOIDmode, \ - 0, 0, OPNUM, TYPE); \ - goto WIN; \ - } \ - } \ -} -/* A C compound statement that attempts to replace X, which is an - address that needs reloading, with a valid memory address for an - operand of mode MODE. WIN will be a C statement label elsewhere - in the code. It is not necessary to define this macro, but it - might be useful for performance reasons. - - For example, on the i386, it is sometimes possible to use a single - reload register instead of two by reloading a sum of two pseudo - registers into a register. On the other hand, for number of RISC - processors offsets are limited so that often an intermediate - address needs to be generated in order to address a stack slot. - By defining LEGITIMIZE_RELOAD_ADDRESS appropriately, the - intermediate addresses generated for adjacent some stack slots can - be made identical, and thus be shared. - - *Note*: This macro should be used with caution. It is necessary - to know something of how reload works in order to effectively use - this, and it is quite easy to produce macros that build in too - much knowledge of reload internals. - - *Note*: This macro must be able to reload an address created by a - previous invocation of this macro. If it fails to handle such - addresses then the compiler may generate incorrect code or abort. - - The macro definition should use `push_reload' to indicate parts - that need reloading; OPNUM, TYPE and IND_LEVELS are usually - suitable to be passed unaltered to `push_reload'. - - The code generated by this macro must not alter the substructure of - X. If it transforms X into a more legitimate form, it should - assign X (which will always be a C variable) a new value. This - also applies to parts that you change indirectly by calling - `push_reload'. - - The macro definition may use `strict_memory_address_p' to test if - the address has become legitimate. - - If you want to change only a part of X, one standard way of doing - this is to use `copy_rtx'. Note, however, that is unshares only a - single level of rtl. Thus, if the part to be changed is not at the - top level, you'll need to replace first the top leve It is not - necessary for this macro to come up with a legitimate address; - but often a machine-dependent strategy can generate better code. */ - -#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \ - do { \ - if (ip2k_mode_dependent_address (ADDR)) goto LABEL; \ - } while (0) - -/* 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 LEGITIMATE_CONSTANT_P(X) 1 -/* A C expression that is nonzero if X is a legitimate constant for - an immediate operand on the target machine. You can assume that X - satisfies `CONSTANT_P', so you need not check this. In fact, `1' - is a suitable definition for this macro on machines where anything - `CONSTANT_P' is valid. */ - -#define CONST_COSTS(RTX,CODE,OUTER_CODE) \ - case CONST_INT: \ - return 0; \ - case CONST: \ - return 8; \ - case LABEL_REF: \ - return 0; \ - case SYMBOL_REF: \ - return 8; \ - case CONST_DOUBLE: \ - return 0; - -/* A part of a C `switch' statement that describes the relative costs - of constant RTL expressions. It must contain `case' labels for - expression codes `const_int', `const', `symbol_ref', `label_ref' - and `const_double'. Each case must ultimately reach a `return' - statement to return the relative cost of the use of that kind of - constant value in an expression. The cost may depend on the - precise value of the constant, which is available for examination - in X, and the rtx code of the expression in which it is contained, - found in OUTER_CODE. - - CODE is the expression code--redundant, since it can be obtained - with `GET_CODE (X)'. */ - -#define DEFAULT_RTX_COSTS(X, CODE, OUTER_CODE) \ - return default_rtx_costs ((X), (CODE), (OUTER_CODE)) - -/* Like `CONST_COSTS' but applies to nonconstant RTL expressions. - This can be used, for example, to indicate how costly a multiply - instruction is. In writing this macro, you can use the construct - `COSTS_N_INSNS (N)' to specify a cost equal to N fast - instructions. OUTER_CODE is the code of the expression in which X - is contained. - - This macro is optional; do not define it if the default cost - assumptions are adequate for the target machine. */ - -#define ADDRESS_COST(ADDRESS) ip2k_address_cost (ADDRESS) - -/* An expression giving the cost of an addressing mode that contains - ADDRESS. If not defined, the cost is computed from the ADDRESS - expression and the `CONST_COSTS' values. - - For most CISC machines, the default cost is a good approximation - of the true cost of the addressing mode. However, on RISC - machines, all instructions normally have the same length and - execution time. Hence all addresses will have equal costs. - - In cases where more than one form of an address is known, the form - with the lowest cost will be used. If multiple forms have the - same, lowest, cost, the one that is the most complex will be used. - - For example, suppose an address that is equal to the sum of a - register and a constant is used twice in the same basic block. - When this macro is not defined, the address will be computed in a - register and memory references will be indirect through that - register. On machines where the cost of the addressing mode - containing the sum is no higher than that of a simple indirect - reference, this will produce an additional instruction and - possibly require an additional register. Proper specification of - this macro eliminates this overhead for such machines. - - Similar use of this macro is made in strength reduction of loops. - - ADDRESS need not be valid as an address. In such a case, the cost - is not relevant and can be any value; invalid addresses need not be - assigned a different cost. - - On machines where an address involving more than one register is as - cheap as an address computation involving only one register, - defining `ADDRESS_COST' to reflect this can cause two registers to - be live over a region of code where only one would have been if - `ADDRESS_COST' were not defined in that manner. This effect should - be considered in the definition of this macro. Equivalent costs - should probably only be given to addresses with different numbers - of registers on machines with lots of registers. - - This macro will normally either not be defined or be defined as a - constant. */ - -#define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) 7 -/* A C expression for the cost of moving data from a register in class - FROM to one in class TO. The classes are expressed using the - enumeration values such as `GENERAL_REGS'. A value of 2 is the - default; other values are interpreted relative to that. - - It is not required that the cost always equal 2 when FROM is the - same as TO; on some machines it is expensive to move between - registers if they are not general registers. - - If reload sees an insn consisting of a single `set' between two - hard registers, and if `REGISTER_MOVE_COST' applied to their - classes returns a value of 2, reload does not check to ensure that - the constraints of the insn are met. Setting a cost of other than - 2 will allow reload to verify that the constraints are met. You - should do this if the `movM' pattern's constraints do not allow - such copying. */ - -#define MEMORY_MOVE_COST(MODE,CLASS,IN) 6 -/* A C expression for the cost of moving data of mode M between a - register and memory. A value of 4 is the default; this cost is - relative to those in `REGISTER_MOVE_COST'. - - If moving between registers and memory is more expensive than - between two registers, you should define this macro to express the - relative cost. */ - -#define SLOW_BYTE_ACCESS 0 -/* Define this macro as a C expression which is nonzero if accessing - less than a word of memory (i.e. a `char' or a `short') is no - faster than accessing a word of memory, i.e., if such access - require more than one instruction or if there is no difference in - cost between byte and (aligned) word loads. - - When this macro is not defined, the compiler will access a field by - finding the smallest containing object; when it is defined, a - fullword load will be used if alignment permits. Unless bytes - accesses are faster than word accesses, using word accesses is - preferable since it may eliminate subsequent memory access if - subsequent accesses occur to other fields in the same word of the - structure, but to different bytes. - - `SLOW_ZERO_EXTEND' - Define this macro if zero-extension (of a `char' or `short' to an - `int') can be done faster if the destination is a register that is - known to be zero. - - If you define this macro, you must have instruction patterns that - recognize RTL structures like this: - - (set (strict_low_part (subreg:QI (reg:SI ...) 0)) ...) - - and likewise for `HImode'. - - `SLOW_UNALIGNED_ACCESS' - Define this macro to be the value 1 if unaligned accesses have a - cost many times greater than aligned accesses, for example if they - are emulated in a trap handler. - - When this macro is non-zero, the compiler will act as if - `STRICT_ALIGNMENT' were non-zero when generating code for block - moves. This can cause significantly more instructions to be - produced. Therefore, do not set this macro non-zero if unaligned - accesses only add a cycle or two to the time for a memory access. - - If the value of this macro is always zero, it need not be defined. - - `DONT_REDUCE_ADDR' - Define this macro to inhibit strength reduction of memory - addresses. (On some machines, such strength reduction seems to do - harm rather than good.) - - `MOVE_RATIO' - The number of scalar move insns which should be generated instead - of a string move insn or a library call. Increasing the value - will always make code faster, but eventually incurs high cost in - increased code size. - - If you don't define this, a reasonable default is used. */ - -#define NO_FUNCTION_CSE -/* Define this macro if it is as good or better to call a constant - function address than to call an address kept in a register. */ - -#define NO_RECURSIVE_FUNCTION_CSE -/* Define this macro if it is as good or better for a function to call - itself with an explicit address than to call an address kept in a - register. - - `ADJUST_COST (INSN, LINK, DEP_INSN, COST)' - A C statement (sans semicolon) to update the integer variable COST - based on the relationship between INSN that is dependent on - DEP_INSN through the dependence LINK. The default is to make no - adjustment to COST. This can be used for example to specify to - the scheduler that an output- or anti-dependence does not incur - the same cost as a data-dependence. - - `ADJUST_PRIORITY (INSN)' - A C statement (sans semicolon) to update the integer scheduling - priority `INSN_PRIORITY(INSN)'. Reduce the priority to execute - the INSN earlier, increase the priority to execute INSN later. - Do not define this macro if you do not need to adjust the - scheduling priorities of insns. */ - -#define TEXT_SECTION_ASM_OP ".text" -/* A C expression whose value is a string containing the assembler - operation that should precede instructions and read-only data. - Normally `".text"' is right. */ - -#define DATA_SECTION_ASM_OP ".data" -/* A C expression whose value is a string containing the assembler - operation to identify the following data as writable initialized - data. Normally `".data"' is right. */ - -#define JUMP_TABLES_IN_TEXT_SECTION 1 -/* Define this macro if jump tables (for `tablejump' insns) should be - output in the text section, along with the assembler instructions. - Otherwise, the readonly data section is used. - - This macro is irrelevant if there is no separate readonly data - section. */ - -#define ASM_COMMENT_START " ; " -/* A C string constant describing how to begin a comment in the target - assembler language. The compiler assumes that the comment will - end at the end of the line. */ - -#define ASM_APP_ON "/* #APP */\n" -/* A C string constant for text to be output before each `asm' - statement or group of consecutive ones. Normally this is - `"#APP"', which is a comment that has no effect on most assemblers - but tells the GNU assembler that it must check the lines that - follow for all valid assembler constructs. */ - -#define ASM_APP_OFF "/* #NOAPP */\n" -/* A C string constant for text to be output after each `asm' - statement or group of consecutive ones. Normally this is - `"#NO_APP"', which tells the GNU assembler to resume making the - time-saving assumptions that are valid for ordinary compiler - output. */ - - -#define OBJC_PROLOGUE {} -/* A C statement to output any assembler statements which are - required to precede any Objective C object definitions or message - sending. The statement is executed only when compiling an - Objective C program. */ - -#define ASM_OUTPUT_DOUBLE(STREAM, VALUE) \ - fprintf ((STREAM), ".double %.20e\n", (VALUE)) -#define ASM_OUTPUT_FLOAT(STREAM, VALUE) \ - asm_output_float ((STREAM), (VALUE)) - -/* `ASM_OUTPUT_LONG_DOUBLE (STREAM, VALUE)' - `ASM_OUTPUT_THREE_QUARTER_FLOAT (STREAM, VALUE)' - `ASM_OUTPUT_SHORT_FLOAT (STREAM, VALUE)' - `ASM_OUTPUT_BYTE_FLOAT (STREAM, VALUE)' - A C statement to output to the stdio stream STREAM an assembler - instruction to assemble a floating-point constant of `TFmode', - `DFmode', `SFmode', `TQFmode', `HFmode', or `QFmode', - respectively, whose value is VALUE. VALUE will be a C expression - of type `REAL_VALUE_TYPE'. Macros such as - `REAL_VALUE_TO_TARGET_DOUBLE' are useful for writing these - definitions. */ - -#define ASM_OUTPUT_INT(FILE, VALUE) \ - ( fprintf ((FILE), "\t.long "), \ - output_addr_const ((FILE), (VALUE)), \ - fputs ("\n", (FILE))) - - /* Likewise for `short' and `char' constants. */ - -#define ASM_OUTPUT_SHORT(FILE,VALUE) \ - asm_output_short ((FILE), (VALUE)) -#define ASM_OUTPUT_CHAR(FILE,VALUE) \ - asm_output_char ((FILE), (VALUE)) - -/* `ASM_OUTPUT_QUADRUPLE_INT (STREAM, EXP)' - A C statement to output to the stdio stream STREAM an assembler - instruction to assemble an integer of 16, 8, 4, 2 or 1 bytes, - respectively, whose value is VALUE. The argument EXP will be an - RTL expression which represents a constant value. Use - `output_addr_const (STREAM, EXP)' to output this value as an - assembler expression. - - For sizes larger than `UNITS_PER_WORD', if the action of a macro - would be identical to repeatedly calling the macro corresponding to - a size of `UNITS_PER_WORD', once for each word, you need not define - the macro. */ - -#define ASM_OUTPUT_BYTE(FILE,VALUE) \ - asm_output_byte ((FILE), (VALUE)) -/* A C statement to output to the stdio stream STREAM an assembler - instruction to assemble a single byte containing the number VALUE. */ - -#define IS_ASM_LOGICAL_LINE_SEPARATOR(C) \ - ((C) == '\n' || ((C) == '$')) -/* Define this macro as a C expression which is nonzero if C is used - as a logical line separator by the assembler. - - If you do not define this macro, the default is that only the - character `;' is treated as a logical line separator. */ - -#define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \ -do { \ - fputs ("\t.comm ", (STREAM)); \ - assemble_name ((STREAM), (NAME)); \ - fprintf ((STREAM), ",%d\n", (SIZE)); \ -} while (0) -/* A C statement (sans semicolon) to output to the stdio stream - STREAM the assembler definition of a common-label named NAME whose - size is SIZE bytes. The variable ROUNDED is the size rounded up - to whatever alignment the caller wants. - - Use the expression `assemble_name (STREAM, NAME)' to output the - name itself; before and after that, output the additional - assembler syntax for defining the name, and a newline. - - This macro controls how the assembler definitions of uninitialized - common global variables are output. */ - -#define ASM_OUTPUT_LOCAL(STREAM, NAME, SIZE, ROUNDED) \ -do { \ - fputs ("\t.lcomm ", (STREAM)); \ - assemble_name ((STREAM), (NAME)); \ - fprintf ((STREAM), ",%d\n", (SIZE)); \ -} while (0) -/* A C statement (sans semicolon) to output to the stdio stream - STREAM the assembler definition of a local-common-label named NAME - whose size is SIZE bytes. The variable ROUNDED is the size - rounded up to whatever alignment the caller wants. - - Use the expression `assemble_name (STREAM, NAME)' to output the - name itself; before and after that, output the additional - assembler syntax for defining the name, and a newline. - - This macro controls how the assembler definitions of uninitialized - static variables are output. */ - -#undef WEAK_ASM_OP -#define WEAK_ASM_OP ".weak" - -#undef ASM_DECLARE_FUNCTION_SIZE -#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ - do { \ - if (!flag_inhibit_size_directive) \ - ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \ - } while (0) -/* A C statement (sans semicolon) to output to the stdio stream - STREAM any text necessary for declaring the size of a function - which is being defined. The argument NAME is the name of the - function. The argument DECL is the `FUNCTION_DECL' tree node - representing the function. - - If this macro is not defined, then the function size is not - defined. */ - -#define ESCAPES \ -"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ -\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\ -\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" -/* A table of bytes codes used by the ASM_OUTPUT_ASCII and - ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table - corresponds to a particular byte value [0..255]. For any - given byte value, if the value in the corresponding table - position is zero, the given character can be output directly. - If the table value is 1, the byte must be output as a \ooo - octal escape. If the tables value is anything else, then the - byte value should be output as a \ followed by the value - in the table. Note that we can use standard UN*X escape - sequences for many control characters, but we don't use - \a to represent BEL because some svr4 assemblers (e.g. on - the i386) don't know about that. Also, we don't use \v - since some versions of gas, such as 2.2 did not accept it. */ - -/* Globalizing directive for a label. */ -#define GLOBAL_ASM_OP ".global\t" - -#undef ASM_FORMAT_PRIVATE_NAME -#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ -( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \ - sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO))) - -/* A C expression to assign to OUTVAR (which is a variable of type - `char *') a newly allocated string made from the string NAME and - the number NUMBER, with some suitable punctuation added. Use - `alloca' to get space for the string. - - The string will be used as an argument to `ASM_OUTPUT_LABELREF' to - produce an assembler label for an internal static variable whose - name is NAME. Therefore, the string must be such as to result in - valid assembler code. The argument NUMBER is different each time - this macro is executed; it prevents conflicts between - similarly-named internal static variables in different scopes. - - Ideally this string should not be a valid C identifier, to prevent - any conflict with the user's own symbols. Most assemblers allow - periods or percent signs in assembler symbols; putting at least - one of these between the name and the number will suffice. */ - -#define REGISTER_NAMES { \ - "$00","$01","$02","$03","iph","ipl","sph","spl", \ - "pch","pcl","wreg","status","dph","dpl","$0e","mulh", \ - "$10","$11","$12","$13","$14","$15","$16","$17", \ - "$18","$19","$1a","$1b","$1c","$1d","$1e","$1f", \ - "$20","$21","$22","$23","$24","$25","$26","$27", \ - "$28","$29","$2a","$2b","$2c","$2d","$2e","$2f", \ - "$30","$31","$32","$33","$34","$35","$36","$37", \ - "$38","$39","$3a","$3b","$3c","$3d","$3e","$3f", \ - "$40","$41","$42","$43","$44","$45","$46","$47", \ - "$48","$49","$4a","$4b","$4c","$4d","$4e","$4f", \ - "$50","$51","$52","$53","$54","$55","$56","$57", \ - "$58","$59","$5a","$5b","$5c","$5d","$5e","$5f", \ - "$60","$61","$62","$63","$64","$65","$66","$67", \ - "$68","$69","$6a","$6b","$6c","$6d","$6e","$6f", \ - "$70","$71","$72","$73","$74","$75","$76","$77", \ - "$78","$79","$7a","$7b","$7c","$7d","callh","calll", \ - "$80","$81","$82","$83","$84","$85","$86","$87", \ - "$88","$89","$8a","$8b","$8c","$8d","$8e","$8f", \ - "$90","$91","$92","$93","$94","$95","$96","$97", \ - "$98","$99","$9a","$9b","$9c","$9d","$9e","$9f", \ - "$a0","$a1","$a2","$a3","$a4","$a5","$a6","$a7", \ - "$a8","$a9","$aa","$ab","$ac","$ad","$ae","$af", \ - "$b0","$b1","$b2","$b3","$b4","$b5","$b6","$b7", \ - "$b8","$b9","$ba","$bb","$bc","$bd","$be","$bf", \ - "$c0","$c1","$c2","$c3","$c4","$c5","$c6","$c7", \ - "$c8","$c9","$ca","$cb","$cc","$cd","$ce","$cf", \ - "$d0","$d1","$d2","$d3","$d4","$d5","$d6","$d7", \ - "$d8","$d9","$da","$db","$dc","$dd","$de","$df", \ - "$e0","$e1","$e2","$e3","$e4","$e5","$e6","$e7", \ - "$e8","$e9","$ea","$eb","$ec","$ed","$ee","$ef", \ - "$f0","$f1","$f2","$f3","$f4","$f5","$f6","$f7", \ - "$f8","$f9","$fa","$fb","$fc","$fd","$fe","$ff", \ - "vfph","vfpl","vaph","vapl"} - -/* A C initializer containing the assembler's names for the machine - registers, each one as a C string constant. This is what - translates register numbers in the compiler into assembler - language. */ - -#define PRINT_OPERAND(STREAM, X, CODE) \ - print_operand ((STREAM), (X), (CODE)) -/* A C compound statement to output to stdio stream STREAM the - assembler syntax for an instruction operand X. X is an RTL - expression. - - CODE is a value that can be used to specify one of several ways of - printing the operand. It is used when identical operands must be - printed differently depending on the context. CODE comes from the - `%' specification that was used to request printing of the - operand. If the specification was just `%DIGIT' then CODE is 0; - if the specification was `%LTR DIGIT' then CODE is the ASCII code - for LTR. - - If X is a register, this macro should print the register's name. - The names can be found in an array `reg_names' whose type is `char - *[]'. `reg_names' is initialized from `REGISTER_NAMES'. - - When the machine description has a specification `%PUNCT' (a `%' - followed by a punctuation character), this macro is called with a - null pointer for X and the punctuation character for CODE. */ - -#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ - ((CODE) == '<' || (CODE) == '>') - -/* A C expression which evaluates to true if CODE is a valid - punctuation character for use in the `PRINT_OPERAND' macro. If - `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no - punctuation characters (except for the standard one, `%') are used - in this way. */ - -#define PRINT_OPERAND_ADDRESS(STREAM, X) print_operand_address(STREAM, X) -/* A C compound statement to output to stdio stream STREAM the - assembler syntax for an instruction operand that is a memory - reference whose address is X. X is an RTL expression. - - On some machines, the syntax for a symbolic address depends on the - section that the address refers to. On these machines, define the - macro `ENCODE_SECTION_INFO' to store the information into the - `symbol_ref', and then check for it here. *Note Assembler - Format::. */ - -/* Since register names don't have a prefix, we must preface all - user identifiers with the '_' to prevent confusion. */ - -#undef USER_LABEL_PREFIX -#define USER_LABEL_PREFIX "_" -#define LOCAL_LABEL_PREFIX ".L" -/* `LOCAL_LABEL_PREFIX' - `REGISTER_PREFIX' - `IMMEDIATE_PREFIX' - If defined, C string expressions to be used for the `%R', `%L', - `%U', and `%I' options of `asm_fprintf' (see `final.c'). These - are useful when a single `md' file must support multiple assembler - formats. In that case, the various `tm.h' files can define these - macros differently. */ - - -#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \ - asm_fprintf ((STREAM), "\tpage\t%L%d\n\tjmp\t%L%d\n", (VALUE), (VALUE)) - -/* elfos.h presumes that we will want switch/case dispatch tables aligned. - This is not so for the ip2k. */ -#undef ASM_OUTPUT_CASE_LABEL - -#undef ASM_OUTPUT_ADDR_VEC_ELT -#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \ - asm_fprintf ((STREAM), "\tpage\t%L%d\n\tjmp\t%L%d\n", (VALUE), (VALUE)) - -/* This macro should be provided on machines where the addresses in a - dispatch table are absolute. - - The definition should be a C statement to output to the stdio - stream STREAM an assembler pseudo-instruction to generate a - reference to a label. VALUE is the number of an internal label - whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'. For - example, - - fprintf ((STREAM), "\t.word L%d\n", (VALUE)) */ - -#define ASM_OUTPUT_ALIGN(STREAM, POWER) \ - fprintf ((STREAM), "\t.align %d\n", (POWER)) -/* A C statement to output to the stdio stream STREAM an assembler - command to advance the location counter to a multiple of 2 to the - POWER bytes. POWER will be a C expression of type `int'. */ - -/* Since instructions are 16 bit word addresses, we should lie and claim that - the dispatch vectors are in QImode. Otherwise the offset into the jump - table will be scaled by the MODE_SIZE. */ - -#define CASE_VECTOR_MODE QImode -/* An alias for a machine mode name. This is the machine mode that - elements of a jump-table should have. */ - - -/* `CASE_VALUES_THRESHOLD' - Define this to be the smallest number of different values for - which it is best to use a jump-table instead of a tree of - conditional branches. The default is four for machines with a - `casesi' instruction and five otherwise. This is best for most - machines. */ - -#undef WORD_REGISTER_OPERATIONS -/* Define this macro if operations between registers with integral - mode smaller than a word are always performed on the entire - register. Most RISC machines have this property and most CISC - machines do not. */ - -#define MOVE_MAX 1 -/* The maximum number of bytes that a single instruction can move - quickly between memory and registers or between two memory - locations. */ - -#define MOVE_RATIO 3 -/* MOVE_RATIO is the number of move instructions that is better than a - block move. Make this small on the IP2k, since the code size grows very - large with each move. */ - -#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 -/* A C expression which is nonzero if on this machine it is safe to - "convert" an integer of INPREC bits to one of OUTPREC bits (where - OUTPREC is smaller than INPREC) by merely operating on it as if it - had only OUTPREC bits. - - On many machines, this expression can be 1. - - When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for - modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result. - If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in - such cases may improve things. */ - -#define Pmode HImode -/* An alias for the machine mode for pointers. On most machines, - define this to be the integer mode corresponding to the width of a - hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit - machines. On some machines you must define this to be one of the - partial integer modes, such as `PSImode'. - - The width of `Pmode' must be at least as large as the value of - `POINTER_SIZE'. If it is not equal, you must define the macro - `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to - `Pmode'. */ - -#define FUNCTION_MODE HImode -/* An alias for the machine mode used for memory references to - functions being called, in `call' RTL expressions. On most - machines this should be `QImode'. */ - -#define INTEGRATE_THRESHOLD(DECL) \ - (1 + (3 * list_length (DECL_ARGUMENTS (DECL)) / 2)) -/* A C expression for the maximum number of instructions above which - the function DECL should not be inlined. DECL is a - `FUNCTION_DECL' node. - - The default definition of this macro is 64 plus 8 times the number - of arguments that the function accepts. Some people think a larger - threshold should be used on RISC machines. */ - -#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \ - valid_machine_decl_attribute (DECL, ATTRIBUTES, IDENTIFIER, ARGS) -/* If defined, a C expression whose value is nonzero if IDENTIFIER - with arguments ARGS is a valid machine specific attribute for DECL. - The attributes in ATTRIBUTES have previously been assigned to DECL. */ - -#define VALID_MACHINE_TYPE_ATTRIBUTE(TYPE, ATTRIBUTES, IDENTIFIER, ARGS) \ - valid_machine_type_attribute(TYPE, ATTRIBUTES, IDENTIFIER, ARGS) -/* If defined, a C expression whose value is nonzero if IDENTIFIER - with arguments ARGS is a valid machine specific attribute for TYPE. - The attributes in ATTRIBUTES have previously been assigned to TYPE. */ - -#define DOLLARS_IN_IDENTIFIERS 0 -/* Define this macro to control use of the character `$' in identifier - names. 0 means `$' is not allowed by default; 1 means it is - allowed. 1 is the default; there is no need to define this macro - in that case. This macro controls the compiler proper; it does - not affect the preprocessor. */ - -#define MACHINE_DEPENDENT_REORG(INSN) machine_dependent_reorg (INSN) -/* In rare cases, correct code generation requires extra machine - dependent processing between the second jump optimization pass and - delayed branch scheduling. On those machines, define this macro - as a C statement to act on the code starting at INSN. */ - -extern int ip2k_reorg_in_progress; -/* Flag if we're in the middle of IP2k-specific reorganization. */ - -extern int ip2k_reorg_completed; -/* Flag if we've completed our IP2k-specific reorganization. If we have - then we allow quite a few more tricks than before. */ - -extern int ip2k_reorg_split_dimode; -extern int ip2k_reorg_split_simode; -extern int ip2k_reorg_split_qimode; -extern int ip2k_reorg_split_himode; -/* Flags for various split operations that we run in sequence. */ - -extern int ip2k_reorg_merge_qimode; -/* Flag to indicate that it's safe to merge QImode operands. */ - -#define GIV_SORT_CRITERION(X, Y) \ - do { \ - if (GET_CODE ((X)->add_val) == CONST_INT \ - && GET_CODE ((Y)->add_val) == CONST_INT) \ - return INTVAL ((X)->add_val) - INTVAL ((Y)->add_val); \ - } while (0) - -/* In some cases, the strength reduction optimization pass can - produce better code if this is defined. This macro controls the - order that induction variables are combined. This macro is - particularly useful if the target has limited addressing modes. - For instance, the SH target has only positive offsets in - addresses. Thus sorting to put the smallest address first allows - the most combinations to be found. */ - -#define TRAMPOLINE_TEMPLATE(FILE) abort () - -/* Length in units of the trampoline for entering a nested function. */ - -#define TRAMPOLINE_SIZE 4 - -/* 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 (HImode, plus_constant ((TRAMP), 2)), \ - CXT); \ - emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 6)), \ - FNADDR); \ -} -/* Store in cc_status the expressions - that the condition codes will describe - after execution of an instruction whose pattern is EXP. - Do not alter them if the instruction would not alter the cc's. */ - -#define NOTICE_UPDATE_CC(EXP, INSN) (void)(0) - -/* Output assembler code to FILE to increment profiler label # LABELNO - for profiling a function entry. */ - -#define FUNCTION_PROFILER(FILE, LABELNO) \ - fprintf ((FILE), "/* profiler %d */", (LABELNO)) - -#define TARGET_MEM_FUNCTIONS -/* Define this macro if GNU CC should generate calls to the System V - (and ANSI C) library functions `memcpy' and `memset' rather than - the BSD functions `bcopy' and `bzero'. */ - - -#undef ENDFILE_SPEC -#undef LINK_SPEC -#undef STARTFILE_SPEC - -/* Another C string constant used much like `LINK_SPEC'. The - difference between the two is that `ENDFILE_SPEC' is used at the - very end of the command given to the linker. - - Do not define this macro if it does not need to do anything. */ - -#if defined(__STDC__) || defined(ALMOST_STDC) -#define AS2(a,b,c) #a "\t" #b "," #c -#define AS1(a,b) #a "\t" #b -#else -#define AS1(a,b) "a b" -#define AS2(a,b,c) "a b,c" -#endif -#define OUT_AS1(a,b) output_asm_insn (AS1 (a,b), operands) -#define OUT_AS2(a,b,c) output_asm_insn (AS2 (a,b,c), operands) -#define CR_TAB "\n\t" - -/* Define this macro as a C statement that declares additional library - routines renames existing ones. `init_optabs' calls this macro - after initializing all the normal library routines. */ - -#define INIT_TARGET_OPTABS \ -{ \ - smul_optab->handlers[(int) SImode].libfunc \ - = gen_rtx_SYMBOL_REF (Pmode, "_mulsi3"); \ - \ - smul_optab->handlers[(int) DImode].libfunc \ - = gen_rtx_SYMBOL_REF (Pmode, "_muldi3"); \ - \ - cmp_optab->handlers[(int) HImode].libfunc \ - = gen_rtx_SYMBOL_REF (Pmode, "_cmphi2"); \ - \ - cmp_optab->handlers[(int) SImode].libfunc \ - = gen_rtx_SYMBOL_REF (Pmode, "_cmpsi2"); \ -} - -#define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT - -#define PREDICATE_CODES \ - {"ip2k_ip_operand", {MEM}}, \ - {"ip2k_short_operand", {MEM}}, \ - {"ip2k_gen_operand", {MEM, REG, SUBREG}}, \ - {"ip2k_nonptr_operand", {REG, SUBREG}}, \ - {"ip2k_ptr_operand", {REG, SUBREG}}, \ - {"ip2k_split_dest_operand", {REG, SUBREG, MEM}}, \ - {"ip2k_sp_operand", {REG}}, \ - {"ip2k_nonsp_reg_operand", {REG, SUBREG}}, \ - {"ip2k_symbol_ref_operand", {SYMBOL_REF}}, \ - {"ip2k_binary_operator", {PLUS, MINUS, MULT, DIV, \ - UDIV, MOD, UMOD, AND, IOR, \ - XOR, COMPARE, ASHIFT, \ - ASHIFTRT, LSHIFTRT}}, \ - {"ip2k_unary_operator", {NEG, NOT, SIGN_EXTEND, \ - ZERO_EXTEND}}, \ - {"ip2k_unsigned_comparison_operator", {LTU, GTU, NE, \ - EQ, LEU, GEU}},\ - {"ip2k_signed_comparison_operator", {LT, GT, LE, GE}}, - -#define DWARF2_DEBUGGING_INFO 1 - -#define DWARF2_ASM_LINE_DEBUG_INFO 1 - -#define DBX_REGISTER_NUMBER(REGNO) (REGNO) - -/* Miscellaneous macros to describe machine specifics. */ - -#define STORE_FLAG_VALUE 1 - -#define IS_PSEUDO_P(R) (REGNO (R) >= FIRST_PSEUDO_REGISTER) - -/* Default calculations would cause DWARF address sizes to be 2 bytes, - but the Harvard architecture of the IP2k and the word-addressed 64k - of instruction memory causes us to want a 32-bit "address" field. */ -#undef DWARF2_ADDR_SIZE -#define DWARF2_ADDR_SIZE 4 - |