⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stormy16.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
            / UNITS_PER_WORD))  */#define HARD_REGNO_NREGS(REGNO, MODE) 				\  ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)/* 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 HARD_REGNO_MODE_OK(REGNO, MODE) ((REGNO) != 16 || (MODE) == BImode)/* 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.  */#define MODES_TIEABLE_P(MODE1, MODE2) ((MODE1) != BImode && (MODE2) != BImode)/* Define this macro if the compiler should avoid copies to/from CCmode   registers.  You should only define this macro if support fo copying to/from   CCmode is incomplete.  *//* #define AVOID_CCMODE_COPIES *//* Handling Leaf Functions *//* A C initializer for a vector, indexed by hard register number, which   contains 1 for a register that is allowable in a candidate for leaf function   treatment.   If leaf function treatment involves renumbering the registers, then the   registers marked here should be the ones before renumbering--those that GNU   CC would ordinarily allocate.  The registers which will actually be used in   the assembler code, after renumbering, should not be marked with 1 in this   vector.   Define this macro only if the target machine offers a way to optimize the   treatment of leaf functions.  *//* #define LEAF_REGISTERS *//* A C expression whose value is the register number to which REGNO should be   renumbered, when a function is treated as a leaf function.   If REGNO is a register number which should not appear in a leaf function   before renumbering, then the expression should yield -1, which will cause   the compiler to abort.   Define this macro only if the target machine offers a way to optimize the   treatment of leaf functions, and registers need to be renumbered to do this.  *//* #define LEAF_REG_REMAP(REGNO) *//* Register 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.  */enum reg_class{  NO_REGS,  R0_REGS,  R1_REGS,  TWO_REGS,  R2_REGS,  EIGHT_REGS,  R8_REGS,  ICALL_REGS,  GENERAL_REGS,  CARRY_REGS,  ALL_REGS,  LIM_REG_CLASSES};/* The number of distinct register classes, defined as follows:        #define N_REG_CLASSES (int) LIM_REG_CLASSES  */#define N_REG_CLASSES ((int) LIM_REG_CLASSES)/* 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_NAMES				\{						\  "NO_REGS", 					\  "R0_REGS", 					\  "R1_REGS",					\  "TWO_REGS",					\  "R2_REGS",					\  "EIGHT_REGS",					\  "R8_REGS",					\  "ICALL_REGS",					\  "GENERAL_REGS",				\  "CARRY_REGS",					\  "ALL_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 REG_CLASS_CONTENTS			\{						\  { 0x00000 },					\  { 0x00001 },					\  { 0x00002 },					\  { 0x00003 },					\  { 0x00004 },					\  { 0x000FF },					\  { 0x00100 },					\  { 0x00300 },					\  { 0x6FFFF },					\  { 0x10000 },					\  { (1 << FIRST_PSEUDO_REGISTER) - 1 }		\}/* 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 REGNO_REG_CLASS(REGNO) 			\  ((REGNO) == 0   ? R0_REGS			\   : (REGNO) == 1 ? R1_REGS			\   : (REGNO) == 2 ? R2_REGS			\   : (REGNO) < 8  ? EIGHT_REGS			\   : (REGNO) == 8 ? R8_REGS			\   : (REGNO) == 16 ? CARRY_REGS			\   : (REGNO) <= 18 ? GENERAL_REGS		\   : ALL_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 BASE_REG_CLASS GENERAL_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 INDEX_REG_CLASS GENERAL_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.   The following letters are unavailable, due to being used as   constraints:	'0'..'9'	'<', '>'	'E', 'F', 'G', 'H'	'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'	'Q', 'R', 'S', 'T', 'U'	'V', 'X'	'g', 'i', 'm', 'n', 'o', 'p', 'r', 's' */#define REG_CLASS_FROM_LETTER(CHAR)		\ (  (CHAR) == 'a' ? R0_REGS			\  : (CHAR) == 'b' ? R1_REGS			\  : (CHAR) == 'c' ? R2_REGS			\  : (CHAR) == 'd' ? R8_REGS			\  : (CHAR) == 'e' ? EIGHT_REGS			\  : (CHAR) == 't' ? TWO_REGS			\  : (CHAR) == 'y' ? CARRY_REGS			\  : (CHAR) == 'z' ? ICALL_REGS			\  : NO_REGS)/* A C expression which is nonzero if register number NUM 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_OK_FOR_BASE_P(NUM) 1/* 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 REGNO_OK_FOR_INDEX_P(NUM) REGNO_OK_FOR_BASE_P (NUM)/* 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.   This declaration must be present.  */#define PREFERRED_RELOAD_CLASS(X, CLASS) \  xstormy16_preferred_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.  */#define PREFERRED_OUTPUT_RELOAD_CLASS(X, CLASS) \  xstormy16_preferred_reload_class (X, 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.  *//* #define LIMIT_RELOAD_CLASS(MODE, CLASS) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -