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

📄 rtl.h

📁 这是完整的gcc源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* Register Transfer Language (RTL) definitions for GNU C-Compiler   Copyright (C) 1987 Free Software Foundation, Inc.This file is part of GNU CC.GNU CC is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 1, 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU CC; see the file COPYING.  If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */#undef FFS  /* Some systems predefine this symbol; don't let it interfere.  *//* Register Transfer Language EXPRESSIONS CODES */#define RTX_CODE	enum rtx_codeenum rtx_code  {#define DEF_RTL_EXPR(ENUM, NAME, FORMAT)   ENUM ,#include "rtl.def"		/* rtl expressions are documented here */#undef DEF_RTL_EXPR  LAST_AND_UNUSED_RTX_CODE};	/* A convienent way to get a value for				   NUM_RTX_CODE.				   Assumes default enum value assignement.  */#define NUM_RTX_CODE ((int)LAST_AND_UNUSED_RTX_CODE)				/* The cast here, saves many elsewhere.  */extern int rtx_length[];#define GET_RTX_LENGTH(CODE)		(rtx_length[(int)(CODE)])extern char *rtx_name[];#define GET_RTX_NAME(CODE)		(rtx_name[(int)(CODE)])extern char *rtx_format[];#define GET_RTX_FORMAT(CODE)		(rtx_format[(int)(CODE)])/* Get the definition of `enum machine_mode' */#ifndef HAVE_MACHINE_MODES#define DEF_MACHMODE(SYM, NAME, TYPE, SIZE, UNIT, WIDER)  SYM,enum machine_mode {#include "machmode.def"MAX_MACHINE_MODE };#undef DEF_MACHMODE#define HAVE_MACHINE_MODES#endif /* not HAVE_MACHINE_MODES */#ifndef NUM_MACHINE_MODES#define NUM_MACHINE_MODES (int) MAX_MACHINE_MODE#endif/* Get the name of mode MODE as a string.  */extern char *mode_name[];#define GET_MODE_NAME(MODE)		(mode_name[(int)(MODE)])enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT,		  MODE_COMPLEX_INT, MODE_COMPLEX_FLOAT, MODE_FUNCTION };/* Get the general kind of object that mode MODE represents   (integer, floating, complex, etc.)  */extern enum mode_class mode_class[];#define GET_MODE_CLASS(MODE)		(mode_class[(int)(MODE)])/* Get the size in bytes of an object of mode MODE.  */extern int mode_size[];#define GET_MODE_SIZE(MODE)		(mode_size[(int)(MODE)])/* Get the size in bytes of the basic parts of an object of mode MODE.  */extern int mode_unit_size[];#define GET_MODE_UNIT_SIZE(MODE)	(mode_unit_size[(int)(MODE)])/* Get the size in bits of an object of mode MODE.  */#define GET_MODE_BITSIZE(MODE)  (BITS_PER_UNIT * mode_size[(int)(MODE)])/* Get a bitmask containing 1 for all bits in a word   that fit within mode MODE.  */#define GET_MODE_MASK(MODE)  \   ((GET_MODE_BITSIZE (MODE) >= HOST_BITS_PER_INT)  \    ? -1 : ((1 << GET_MODE_BITSIZE (MODE)) - 1))/* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */extern enum machine_mode mode_wider_mode[];#define GET_MODE_WIDER_MODE(MODE)	(mode_wider_mode[(int)(MODE)])/* Common union for an element of an rtx.  */typedef union rtunion_def{  int rtint;  char *rtstr;  struct rtx_def *rtx;  struct rtvec_def *rtvec;  enum machine_mode rttype;} rtunion;/* RTL expression ("rtx").  */typedef struct rtx_def{#ifdef SHORT_ENUM_BUG  unsigned short code;#else  /* The kind of expression this is.  */  enum rtx_code code : 16;#endif  /* The kind of value the expression has.  */  enum machine_mode mode : 8;  /* 1 in an INSN if it can alter flow of control     within this function.  Not yet used!  */  unsigned int jump : 1;  /* 1 in an INSN if it can call another function.  Not yet used!  */  unsigned int call : 1;  /* 1 in a MEM or REG if value of this expression will never change     during the current function, even though it is not     manifestly constant.     1 in a SYMBOL_REF if it addresses something in the per-function     constants pool.  */  unsigned int unchanging : 1;  /* 1 in a MEM expression if contents of memory are volatile.  */  /* 1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL or BARRIER     if it is deleted.  */  /* 1 in a REG expression if corresponds to a variable declared by the user.     0 for an internally generated temporary.  */  unsigned int volatil : 1;  /* 1 in a MEM referring to a field of a structure (not a union!).     0 if the MEM was a variable or the result of a * operator in C;     1 if it was the result of a . or -> operator (on a struct) in C.  */  unsigned int in_struct : 1;  /* 1 if this rtx is used.  This is used for copying shared structure.     See `unshare_all_rtl'.     This bit is used to detect that event.  */  unsigned int used : 1;  /* Nonzero if this rtx came from procedure integration.     In a REG, nonzero means this reg refers to the return value     of the current function.  */  unsigned integrated : 1;  /* The first element of the operands of this rtx.     The number of operands and their types are controlled     by the `code' field, according to rtl.def.  */  rtunion fld[1];} *rtx;#define NULL_RTX (rtx) 0/* Define macros to access the `code' field of the rtx.  */#ifdef SHORT_ENUM_BUG#define GET_CODE(RTX)		((enum rtx_code) ((RTX)->code))#define PUT_CODE(RTX, CODE)	((RTX)->code = ((short) (CODE)))#else#define GET_CODE(RTX)		((RTX)->code)#define PUT_CODE(RTX, CODE)	((RTX)->code = (CODE))#endif#define GET_MODE(RTX)		((RTX)->mode)#define PUT_MODE(RTX, MODE)	((RTX)->mode = (MODE))#define RTX_INTEGRATED_P(RTX) ((RTX)->integrated)#define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging)/* RTL vector.  These appear inside RTX's when there is a need   for a variable number of things.  The principle use is inside   PARALLEL expressions.  */typedef struct rtvec_def{  unsigned num_elem;		/* number of elements */  rtunion elem[1];} *rtvec;#define NULL_RTVEC (rtvec) 0#define GET_NUM_ELEM(RTVEC)		((RTVEC)->num_elem)#define PUT_NUM_ELEM(RTVEC, NUM)	((RTVEC)->num_elem = (unsigned) NUM)/* 1 if X is a REG.  */#define REG_P(X) (GET_CODE (X) == REG)/* 1 if X is a constant value that is an integer.  */#define CONSTANT_P(X)   \  (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF		\   || GET_CODE (X) == CONST_INT						\   || GET_CODE (X) == CONST)/* General accessor macros for accessing the fields of an rtx.  */#define XEXP(RTX, N)	((RTX)->fld[N].rtx)#define XINT(RTX, N)	((RTX)->fld[N].rtint)#define XSTR(RTX, N)	((RTX)->fld[N].rtstr)#define XVEC(RTX, N)	((RTX)->fld[N].rtvec)#define XVECLEN(RTX, N)	((RTX)->fld[N].rtvec->num_elem)#define XVECEXP(RTX,N,M)((RTX)->fld[N].rtvec->elem[M].rtx)/* ACCESS MACROS for particular fields of insns.  *//* Holds a unique number for each insn.   These are not necessarily sequentially increasing.  */#define INSN_UID(INSN)	((INSN)->fld[0].rtint)/* Chain insns together in sequence.  */#define PREV_INSN(INSN)	((INSN)->fld[1].rtx)#define NEXT_INSN(INSN)	((INSN)->fld[2].rtx)/* The body of an insn.  */#define PATTERN(INSN)	((INSN)->fld[3].rtx)/* Code number of instruction, from when it was recognized.   -1 means this instruction has not been recognized yet.  */#define INSN_CODE(INSN) ((INSN)->fld[4].rtint)/* Set up in flow.c; empty before then.   Holds a chain of INSN_LIST rtx's whose first operands point at   previous insns with direct data-flow connections to this one.   That means that those insns set variables whose next use is in this insn.   They are always in the same basic block as this insn.  */#define LOG_LINKS(INSN)		((INSN)->fld[5].rtx)/* 1 if insn has been deleted.  */#define INSN_DELETED_P(INSN) ((INSN)->volatil)/* Holds a list of notes on what this insn does to various REGs.   It is a chain of EXPR_LIST rtx's, where the second operand   is the chain pointer and the first operand is the REG being described.   The mode field of the EXPR_LIST contains not a real machine mode   but a value that says what this note says about the REG:     REG_DEAD means that the REG dies in this insn.     REG_INC means that the REG is autoincremented or autodecremented.   Note that one insn can have both REG_DEAD and REG_INC for the same register   if the register is preincremented or predecremented in the insn   and not needed afterward.  This can probably happen.     REG_EQUIV describes the insn as a whole; it says that the   insn sets a register to a constant value or to be equivalent to   a memory address.  If the   register is spilled to the stack then the constant value   should be substituted for it.  The contents of the REG_EQUIV   is the constant value or memory address, which may be different   from the source of the SET although it has the same value.      REG_EQUAL is like REG_EQUIV except that the destination   is only momentarily equal to the specified rtx.  Therefore, it   cannot be used for substitution; but it can be used for cse.     REG_RETVAL means that this insn copies the return-value of   a library call out of the hard reg for return values.  This note   is actually an INSN_LIST and it points to the first insn involved   in setting up arguments for the call.  flow.c uses this to delete   the entire library call when its result is dead.     REG_LIBCALL is the inverse of REG_RETVAL: it goes on the first insn   of the library call and points at the one that has the REG_RETVAL.     REG_WAS_0 says that the register set in this insn held 0 before the insn.

⌨️ 快捷键说明

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