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

📄 vax.h

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
	  && REG_OK_FOR_BASE_P (XEXP (X, 1))				\	  && (xfooa = XEXP (X, 0),					\	      INDEX_TERM_P (xfooa, MODE)))				\	goto ADDR; } }#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)  \{ register rtx xfoo, xfoo0, xfoo1;					\  GO_IF_NONINDEXED_ADDRESS (X, ADDR);					\  if (GET_CODE (X) == PLUS)						\    { /* Handle <address>[index] represented with index-sum outermost */\      xfoo = XEXP (X, 0);						\      if (INDEX_TERM_P (xfoo, MODE))					\	{ GO_IF_NONINDEXED_ADDRESS (XEXP (X, 1), ADDR); }		\      xfoo = XEXP (X, 1);						\      if (INDEX_TERM_P (xfoo, MODE))					\	{ GO_IF_NONINDEXED_ADDRESS (XEXP (X, 0), ADDR); }		\      /* Handle offset(reg)[index] with offset added outermost */	\      if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 0)))		\	{ if (GET_CODE (XEXP (X, 1)) == REG				\	      && REG_OK_FOR_BASE_P (XEXP (X, 1)))			\	    goto ADDR;							\	  GO_IF_REG_PLUS_INDEX (XEXP (X, 1), MODE, ADDR); }		\      if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 1)))		\	{ if (GET_CODE (XEXP (X, 0)) == REG				\	      && REG_OK_FOR_BASE_P (XEXP (X, 0)))			\	    goto ADDR;							\	  GO_IF_REG_PLUS_INDEX (XEXP (X, 0), MODE, ADDR); } } }/* Go to LABEL if ADDR (a legitimate address expression)   has an effect that depends on the machine mode it is used for.   On the VAX, the predecrement and postincrement address depend thus   (the amount of decrement or increment being the length of the operand)   and all indexed address depend thus (because the index scale factor   is the length of the operand).  */#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)	\ { if (GET_CODE (ADDR) == POST_INC || GET_CODE (ADDR) == PRE_DEC)	\     goto LABEL; 							\   if (GET_CODE (ADDR) == PLUS)						\     { if (CONSTANT_ADDRESS_P (XEXP (ADDR, 0))				\	   && GET_CODE (XEXP (ADDR, 1)) == REG);			\       else if (CONSTANT_ADDRESS_P (XEXP (ADDR, 1))			\		&& GET_CODE (XEXP (ADDR, 0)) == REG);			\       else goto LABEL; }}/* Specify the machine mode that this machine uses   for the index in the tablejump instruction.  */#define CASE_VECTOR_MODE HImode/* Define as C expression which evaluates to nonzero if the tablejump   instruction expects the table to contain offsets from the address of the   table.   Do not define this if the table should contain absolute addresses.  */#define CASE_VECTOR_PC_RELATIVE 1/* Indicate that jump tables go in the text section.  This is   necessary when compiling PIC code.  */#define JUMP_TABLES_IN_TEXT_SECTION 1/* Define this as 1 if `char' should by default be signed; else as 0.  */#define DEFAULT_SIGNED_CHAR 1/* This flag, if defined, says the same insns that convert to a signed fixnum   also convert validly to an unsigned one.  */#define FIXUNS_TRUNC_LIKE_FIX_TRUNC/* Max number of bytes we can move from memory to memory   in one reasonably fast instruction.  */#define MOVE_MAX 8/* Nonzero if access to memory by bytes is slow and undesirable.  */#define SLOW_BYTE_ACCESS 0/* Define if shifts truncate the shift count   which implies one can omit a sign-extension or zero-extension   of a shift count.  *//* #define SHIFT_COUNT_TRUNCATED *//* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits   is done just by pretending it is already truncated.  */#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1/* Specify the machine mode that pointers have.   After generation of rtl, the compiler makes no further distinction   between pointers and any other objects of this machine mode.  */#define Pmode SImode/* A function address in a call instruction   is a byte address (for indexing purposes)   so give the MEM rtx a byte's mode.  */#define FUNCTION_MODE QImode/* This machine doesn't use IEEE floats.  */#define TARGET_FLOAT_FORMAT VAX_FLOAT_FORMAT/* Specify the cost of a branch insn; roughly the number of extra insns that   should be added to avoid a branch.   Branches are extremely cheap on the VAX while the shift insns often   used to replace branches can be expensive.  */#define BRANCH_COST 0/* Tell final.c how to eliminate redundant test instructions.  *//* Here we define machine-dependent flags and fields in cc_status   (see `conditions.h').  No extra ones are needed for the VAX.  *//* 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) \  vax_notice_update_cc ((EXP), (INSN))#define OUTPUT_JUMP(NORMAL, FLOAT, NO_OV)  \{ if (cc_status.flags & CC_NO_OVERFLOW)				\    return NO_OV;						\  return NORMAL; }/* Control the assembler format that we output.  *//* 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_COMMENT_START "#"/* Output to assembler file text saying following lines   may contain character constants, extra white space, comments, etc.  */#define ASM_APP_ON "#APP\n"/* Output to assembler file text saying following lines   no longer contain unusual constructs.  */#define ASM_APP_OFF "#NO_APP\n"/* Output before read-only data.  */#define TEXT_SECTION_ASM_OP "\t.text"/* Output before writable data.  */#define DATA_SECTION_ASM_OP "\t.data"/* How to refer to registers in assembler output.   This sequence is indexed by compiler's hard-register-number (see above).   The register names will be prefixed by REGISTER_PREFIX, if any.  */#define REGISTER_PREFIX ""#define REGISTER_NAMES \{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", \ "r9", "r10", "r11", "ap", "fp", "sp", "pc"}/* This is BSD, so it wants DBX format.  */#define DBX_DEBUGGING_INFO 1/* Do not break .stabs pseudos into continuations.  */#define DBX_CONTIN_LENGTH 0/* This is the char to use for continuation (in case we need to turn   continuation back on).  */#define DBX_CONTIN_CHAR '?'/* Don't use the `xsfoo;' construct in DBX output; this system   doesn't support it.  */#define DBX_NO_XREFS/* Output the .stabs for a C `static' variable in the data section.  */#define DBX_STATIC_STAB_DATA_SECTION/* VAX specific: which type character is used for type double?  */#define ASM_DOUBLE_CHAR (TARGET_G_FLOAT ? 'g' : 'd')/* This is how to output a command to make the user-level label named NAME   defined for reference from other files.  *//* Globalizing directive for a label.  */#define GLOBAL_ASM_OP ".globl "/* The prefix to add to user-visible assembler symbols.  */#define USER_LABEL_PREFIX "_"/* This is how to store into the string LABEL   the symbol_ref name of an internal numbered label where   PREFIX is the class of label and NUM is the number within the class.   This is suitable for output with `assemble_name'.  */#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)	\  sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))/* This is how to output an insn to push a register on the stack.   It need not be very fast code.  */#define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \  fprintf (FILE, "\tpushl %s\n", reg_names[REGNO])/* This is how to output an insn to pop a register from the stack.   It need not be very fast code.  */#define ASM_OUTPUT_REG_POP(FILE,REGNO)  \  fprintf (FILE, "\tmovl (%s)+,%s\n", reg_names[STACK_POINTER_REGNUM], \	   reg_names[REGNO])/* This is how to output an element of a case-vector that is absolute.   (The VAX does not use such vectors,   but we must define this macro anyway.)  */#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)		\  do							\    {							\      char label[256];					\      ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));\      fprintf (FILE, "\t.long ");			\      assemble_name (FILE, label);			\      fprintf (FILE, "\n");				\    }							\  while (0)/* This is how to output an element of a case-vector that is relative.  */#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)	\  do								\    {								\      char label[256];						\      ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));	\      fprintf (FILE, "\t.word ");				\      assemble_name (FILE, label);				\      ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL));		\      fprintf (FILE, "-");					\      assemble_name (FILE, label);				\      fprintf (FILE, "\n");					\    }								\  while (0)/* This is how to output an assembler line   that says to advance the location counter   to a multiple of 2**LOG bytes.  */#define ASM_OUTPUT_ALIGN(FILE,LOG)  \  fprintf (FILE, "\t.align %d\n", (LOG))/* This is how to output an assembler line   that says to advance the location counter by SIZE bytes.  */#define ASM_OUTPUT_SKIP(FILE,SIZE)  \  fprintf (FILE, "\t.space %u\n", (int)(SIZE))/* This says how to output an assembler line   to define a global common symbol.  */#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \( fputs (".comm ", (FILE)),			\  assemble_name ((FILE), (NAME)),		\  fprintf ((FILE), ",%u\n", (int)(ROUNDED)))/* This says how to output an assembler line   to define a local common symbol.  */#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \( fputs (".lcomm ", (FILE)),			\  assemble_name ((FILE), (NAME)),		\  fprintf ((FILE), ",%u\n", (int)(ROUNDED)))/* Store in OUTPUT a string (made with alloca) containing   an assembler-name for a local static variable named NAME.   LABELNO is an integer which is different for each call.  */#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)	\( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10),	\  sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))/* Print an instruction operand X on file FILE.   CODE is the code from the %-spec that requested printing this operand;   if `%z3' was used to print operand 3, then CODE is 'z'.VAX operand formatting codes: letter	   print   C	reverse branch condition   D	64-bit immediate operand   B	the low 8 bits of the complement of a constant operand   H	the low 16 bits of the complement of a constant operand   M	a mask for the N highest bits of a word   N	the complement of a constant integer operand   P	constant operand plus 1   R	32 - constant operand   b	the low 8 bits of a negated constant operand   h	the low 16 bits of a negated constant operand   #	'd' or 'g' depending on whether dfloat or gfloat is used   |	register prefix  *//* The purpose of D is to get around a quirk or bug in VAX assembler   whereby -1 in a 64-bit immediate operand means 0x00000000ffffffff,   which is not a 64-bit minus one.  As a workaround, we output negative   values in hex.  */#if HOST_BITS_PER_WIDE_INT == 64#  define NEG_HWI_PRINT_HEX16 HOST_WIDE_INT_PRINT_HEX#else#  define NEG_HWI_PRINT_HEX16 "0xffffffff%08lx"#endif#define PRINT_OPERAND_PUNCT_VALID_P(CODE)				\  ((CODE) == '#' || (CODE) == '|')#define PRINT_OPERAND(FILE, X, CODE)  \{ if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE);			\  else if (CODE == '|')							\    fputs (REGISTER_PREFIX, FILE);					\  else if (CODE == 'C')							\    fputs (rev_cond_name (X), FILE);					\  else if (CODE == 'D' && GET_CODE (X) == CONST_INT && INTVAL (X) < 0)	\    fprintf (FILE, "$" NEG_HWI_PRINT_HEX16, INTVAL (X));		\  else if (CODE == 'P' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, INTVAL (X) + 1);	\  else if (CODE == 'N' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, ~ INTVAL (X));		\  /* rotl instruction cannot deal with negative arguments.  */		\  else if (CODE == 'R' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (X));	\  else if (CODE == 'H' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$%d", (int) (0xffff & ~ INTVAL (X)));		\  else if (CODE == 'h' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$%d", (short) - INTVAL (x));			\  else if (CODE == 'B' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$%d", (int) (0xff & ~ INTVAL (X)));			\  else if (CODE == 'b' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$%d", (int) (0xff & - INTVAL (X)));			\  else if (CODE == 'M' && GET_CODE (X) == CONST_INT)			\    fprintf (FILE, "$%d", ~((1 << INTVAL (x)) - 1));			\  else if (GET_CODE (X) == REG)						\    fprintf (FILE, "%s", reg_names[REGNO (X)]);				\  else if (GET_CODE (X) == MEM)						\    output_address (XEXP (X, 0));					\  else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)	\    { char dstr[30];							\      real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X),		\		       sizeof (dstr), 0, 1);				\      fprintf (FILE, "$0f%s", dstr); }					\  else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode)	\    { char dstr[30];							\      real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X),		\		       sizeof (dstr), 0, 1);				\      fprintf (FILE, "$0%c%s", ASM_DOUBLE_CHAR, dstr); }		\  else { putc ('$', FILE); output_addr_const (FILE, X); }}/* Print a memory operand whose address is X, on file FILE.   This uses a function in output-vax.c.  */#define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \ print_operand_address (FILE, ADDR)/* This is a blatent lie.  However, it's good enough, since we don't   actually have any code whatsoever for which this isn't overridden   by the proper FDE definition.  */#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PC_REGNUM)

⌨️ 快捷键说明

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