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

📄 tm-tower-as.h

📁 这是完整的gcc源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
  fprintf ((FILE), ",%u\n", ((SIZE) == 0) ? (ROUNDED) : (SIZE)))/* 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.  */#undef ASM_FORMAT_PRIVATE_NAME#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO)	\( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 11),	\  sprintf ((OUTPUT), "%s%%%%%d", (NAME), (LABELNO)))/* This is how to output a command to make the user-level label named NAME   defined for reference from other files.  */#undef ASM_GLOBALIZE_LABEL#define ASM_GLOBALIZE_LABEL(FILE,NAME)	\do { fputs ("\tglobal ", FILE);         \     assemble_name (FILE, NAME);        \     fputs ("\n", FILE);                \   } while (0)#undef ASM_GENERATE_INTERNAL_LABEL#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)	\  sprintf ((LABEL), "%s%%%d", (PREFIX), (NUM))#undef ASM_OUTPUT_INTERNAL_LABEL#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)	\  fprintf ((FILE), "%s%%%d:\n", (PREFIX), (NUM))#undef ASM_OUTPUT_CASE_LABEL#define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE)			\  fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n",				\           XVECLEN (PATTERN (TABLE), 1), (PREFIX), (NUM));		\#undef ASM_OUTPUT_DOUBLE#define ASM_OUTPUT_DOUBLE(FILE,VALUE)  \do { union { double d; long l[2]; } tem;		\     tem.d = (VALUE);					\     fprintf(FILE, "\tlong 0x%x,0x%x\n", tem.l[0], tem.l[1]); \   } while (0)#undef ASM_OUTPUT_FLOAT#define ASM_OUTPUT_FLOAT(FILE,VALUE)  \do { union { float f; long l;} tem;			\     tem.f = (VALUE);					\     fprintf (FILE, "\tlong 0x%x\n", tem.l);	\   } while (0)/* This is how to output an assembler line defining an `int' constant.  */#undef ASM_OUTPUT_INT#define ASM_OUTPUT_INT(FILE,VALUE)  \( fprintf (FILE, "\tlong "),			\  output_addr_const (FILE, (VALUE)),		\  fprintf (FILE, "\n"))/* Likewise for `char' and `short' constants.  */#undef ASM_OUTPUT_SHORT#define ASM_OUTPUT_SHORT(FILE,VALUE)  \( fprintf (FILE, "\tshort "),			\  output_addr_const (FILE, (VALUE)),		\  fprintf (FILE, "\n"))#undef ASM_OUTPUT_CHAR#define ASM_OUTPUT_CHAR(FILE,VALUE)  \( fprintf (FILE, "\tbyte "),			\  output_addr_const (FILE, (VALUE)),		\  fprintf (FILE, "\n"))/* This is how to output an assembler line for a numeric constant byte.  */#undef ASM_OUTPUT_BYTE#define ASM_OUTPUT_BYTE(FILE,VALUE)  \  fprintf (FILE, "\tbyte 0x%x\n", (VALUE))#undef ASM_OUTPUT_ADDR_VEC_ELT#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \  fprintf (FILE, "\tlong L%%%d\n", (VALUE))#undef ASM_OUTPUT_ADDR_DIFF_ELT#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)  \  fprintf (FILE, "\tshort L%%%d-L%%%d\n", (VALUE), (REL))#undef ASM_OUTPUT_ALIGN#define ASM_OUTPUT_ALIGN(FILE,LOG)	\  if ((LOG) == 1)			\    fprintf (FILE, "\teven\n");	        \  else if ((LOG) != 0)			\    abort ();#undef ASM_OUTPUT_SKIP#define ASM_OUTPUT_SKIP(FILE,SIZE)  \  fprintf (FILE, "\tspace %u\n", (SIZE))#undef PRINT_OPERAND#define PRINT_OPERAND(FILE, X, CODE)  \{ if (CODE == '.') fprintf (FILE, ".");					\  else if (CODE == '#') fprintf (FILE, "&");				\  else if (CODE == '-') fprintf (FILE, "-(%%sp)");			\  else if (CODE == '+') fprintf (FILE, "(%%sp)+");			\  else if (CODE == '@') fprintf (FILE, "(%%sp)");			\  else if (CODE == '!') fprintf (FILE, "%%cc");				\  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)	\    { union { double d; int i[2]; } u;					\      union { float f; int i; } u1;					\      u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X);	\      u1.f = u.d;							\      fprintf (FILE, "&0x%x", u1.i); }				        \  else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode)	\      fprintf (FILE, "&0x%x%08x", CONST_DOUBLE_LOW (X), CONST_DOUBLE_HIGH (X));\  else { putc ('&', FILE); output_addr_const (FILE, X); }}/* Note that this contains a kludge that knows that the only reason   we have an address (plus (label_ref...) (reg...))   is in the insn before a tablejump, and we know that the table is   exactly 10 bytes away.  */#undef PRINT_OPERAND_ADDRESS#define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \{ register rtx reg1, reg2, breg, ireg;					\  register rtx addr = ADDR;						\  rtx offset;								\  switch (GET_CODE (addr))						\    {									\    case REG:								\      fprintf (FILE, "(%s)", reg_names[REGNO (addr)]);			\      break;								\    case PRE_DEC:							\      fprintf (FILE, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]);	\      break;								\    case POST_INC:							\      fprintf (FILE, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]);	\      break;								\    case PLUS:								\      reg1 = 0;	reg2 = 0;						\      ireg = 0;	breg = 0;						\      offset = 0;							\      if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))				\	{								\	  offset = XEXP (addr, 0);					\	  addr = XEXP (addr, 1);					\	}								\      else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))			\	{								\	  offset = XEXP (addr, 1);					\	  addr = XEXP (addr, 0);					\	}								\      if (GET_CODE (addr) != PLUS) ;					\      else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)		\	{								\	  reg1 = XEXP (addr, 0);					\	  addr = XEXP (addr, 1);					\	}								\      else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)		\	{								\	  reg1 = XEXP (addr, 1);					\	  addr = XEXP (addr, 0);					\	}								\      else if (GET_CODE (XEXP (addr, 0)) == MULT)			\	{								\	  reg1 = XEXP (addr, 0);					\	  addr = XEXP (addr, 1);					\	}								\      else if (GET_CODE (XEXP (addr, 1)) == MULT)			\	{								\	  reg1 = XEXP (addr, 1);					\	  addr = XEXP (addr, 0);					\	}								\      else if (GET_CODE (XEXP (addr, 0)) == REG)			\	{								\	  reg1 = XEXP (addr, 0);					\	  addr = XEXP (addr, 1);					\	}								\      else if (GET_CODE (XEXP (addr, 1)) == REG)			\	{								\	  reg1 = XEXP (addr, 1);					\	  addr = XEXP (addr, 0);					\	}								\      if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT		\	  || GET_CODE (addr) == SIGN_EXTEND)				\	{ if (reg1 == 0) reg1 = addr; else reg2 = addr; addr = 0; }	\/*  for OLD_INDEXING							\      else if (GET_CODE (addr) == PLUS)					\	{								\	  if (GET_CODE (XEXP (addr, 0)) == REG)				\	    {								\	      reg2 = XEXP (addr, 0);					\	      addr = XEXP (addr, 1);					\	    }								\	  else if (GET_CODE (XEXP (addr, 1)) == REG)			\	    {								\	      reg2 = XEXP (addr, 1);					\	      addr = XEXP (addr, 0);					\	    }								\	}								\  */									\      if (offset != 0) { if (addr != 0) abort (); addr = offset; }	\      if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND			\		    || GET_CODE (reg1) == MULT))			\	  || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))		\	{ breg = reg2; ireg = reg1; }					\      else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))		\	{ breg = reg1; ireg = reg2; }					\      if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF)	\        { int scale = 1;						\	  if (GET_CODE (ireg) == MULT)					\	    { scale = INTVAL (XEXP (ireg, 1));				\	      ireg = XEXP (ireg, 0); }					\	  if (GET_CODE (ireg) == SIGN_EXTEND)				\	    fprintf (FILE, "10(%%pc,%s.w",				\		     reg_names[REGNO (XEXP (ireg, 0))]); 		\	  else								\	    fprintf (FILE, "10(%%pc,%s.l",				\		     reg_names[REGNO (ireg)]);				\	  if (scale != 1) fprintf (FILE, "*%d", scale);			\	  putc (')', FILE);						\	  break; }							\      if (ireg != 0 || breg != 0)					\	{ int scale = 1;						\	  if (breg == 0)						\	    abort ();							\	  if (addr != 0)						\	    output_addr_const (FILE, addr);				\	  fprintf (FILE, "(%s", reg_names[REGNO (breg)]);		\	  if (ireg != 0)						\	    putc (',', FILE);						\	  if (ireg != 0 && GET_CODE (ireg) == MULT)			\	    { scale = INTVAL (XEXP (ireg, 1));				\	      ireg = XEXP (ireg, 0); }					\	  if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)		\	    fprintf (FILE, "%s.w", reg_names[REGNO (XEXP (ireg, 0))]);	\	  else if (ireg != 0)						\	    fprintf (FILE, "%s.l", reg_names[REGNO (ireg)]);		\	  if (scale != 1) fprintf (FILE, "*%d", scale);			\	  putc (')', FILE);						\	  break;							\	}								\      else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF)		\	{ fprintf (FILE, "10(%%pc,%s.w)",				\		   reg_names[REGNO (reg1)]);				\	  break; }							\    default:								\        output_addr_const (FILE, addr);					\    }}/* Override usual definitions of SDB output macros.   These definitions differ only in the absence of the period   at the beginning of the name of the directive   and in the use of `~' as the symbol for the current location.  */#define PUT_SDB_SCL(a) fprintf(asm_out_file, "\tscl\t%d;", (a))#define PUT_SDB_INT_VAL(a) fprintf (asm_out_file, "\tval\t%d;", (a))#define PUT_SDB_VAL(a)				\( fputs ("\tval\t", asm_out_file),		\  output_addr_const (asm_out_file, (a)),	\  fputc (';', asm_out_file))#define PUT_SDB_DEF(a)				\do { fprintf (asm_out_file, "\tdef\t");	\     ASM_OUTPUT_LABELREF (asm_out_file, a); 	\     fprintf (asm_out_file, ";"); } while (0)#define PUT_SDB_PLAIN_DEF(a) fprintf(asm_out_file,"\tdef\t~%s;",a)#define PUT_SDB_ENDEF fputs("\tendef\n", asm_out_file)#define PUT_SDB_TYPE(a) fprintf(asm_out_file, "\ttype\t0%o;", a)#define PUT_SDB_SIZE(a) fprintf(asm_out_file, "\tsize\t%d;", a)#define PUT_SDB_START_DIM fprintf(asm_out_file, "\tdim\t")#define PUT_SDB_TAG(a)				\do { fprintf (asm_out_file, "\ttag\t");	\     ASM_OUTPUT_LABELREF (asm_out_file, a);	\     fprintf (asm_out_file, ";"); } while (0)#define PUT_SDB_BLOCK_START(LINE)		\  fprintf (asm_out_file,			\	   "\tdef\t~bb;\tval\t~;\tscl\t100;\tline\t%d;\tendef\n",	\	   (LINE))#define PUT_SDB_BLOCK_END(LINE)			\  fprintf (asm_out_file,			\	   "\tdef\t~eb;\tval\t~;\tscl\t100;\tline\t%d;\tendef\n",	\	   (LINE))#define PUT_SDB_FUNCTION_START(LINE)		\  fprintf (asm_out_file,			\	   "\tdef\t~bf;\tval\t~;\tscl\t101;\tline\t%d;\tendef\n",	\	   (LINE))#define PUT_SDB_FUNCTION_END(LINE)		\  fprintf (asm_out_file,			\	   "\tdef\t~ef;\tval\t~;\tscl\t101;\tline\t%d;\tendef\n",	\	   (LINE))#define PUT_SDB_EPILOGUE_END(NAME)		\  fprintf (asm_out_file,			\	   "\tdef\t%s;\tval\t~;\tscl\t-1;\tendef\n",	\	   (NAME))#define SDB_GENERATE_FAKE(BUFFER, NUMBER) \  sprintf ((BUFFER), "~%dfake", (NUMBER));

⌨️ 快捷键说明

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