dpx2.h

来自「gcc3.2.1源代码」· C头文件 代码 · 共 496 行 · 第 1/2 页

H
496
字号
    { ++(PTR);						\      while (*(PTR) != ' ')				\	{ putc (*(PTR), (FILE)); ++(PTR); }		\    }			                          	\  else if ((PTR)[0] == 'f')                             \    {                                                   \      if (!strncmp ((PTR), "fbeq", 4))                  \        { fprintf ((FILE), "fbseq"); (PTR) += 4; }      \      else if (!strncmp ((PTR), "fbne", 4))             \        { fprintf ((FILE), "fbsneq"); (PTR) += 4; }     \    }                                                   \  else if ((PTR)[0] == 'b' && (PTR)[1] == 'f')          \    {                                                   \      char *s;                                          \      if ((s = (char*)strchr ((PTR), '{')))             \	while (*s != '}') {                             \	  if (*s == 'b')                                \	    /* hack, I replace it with R ie nothing */  \	    *s = '0';                                   \	  s++; }					\    }                                                   \}/* This is how to output an element of a case-vector that is absolute.   (The 68000 does not use such vectors,   but we must define this macro anyway.)  */#undef ASM_OUTPUT_ADDR_VEC_ELT#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \  asm_fprintf (FILE, "\tdc.l %LL%d\n", VALUE)/* This is how to output an element of a case-vector that is relative.  */#undef ASM_OUTPUT_ADDR_DIFF_ELT#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)  \  asm_fprintf (FILE, "\tdc.w %LL%d-%LL%d\n", VALUE, REL)/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to   keep switch tables in the text section.  */#define JUMP_TABLES_IN_TEXT_SECTION 1/* Output a float value (represented as a C double) as an immediate operand.   This macro is a 68k-specific macro.  */#undef ASM_OUTPUT_FLOAT_OPERAND#define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE)		\ do {								\      if (CODE == 'f')						\        {							\          char dstr[30];					\          REAL_VALUE_TO_DECIMAL (VALUE, "%.9g", dstr);		\          asm_fprintf ((FILE), "%I%s", dstr);			\        }							\      else							\        {							\          long l;						\          REAL_VALUE_TO_TARGET_SINGLE (VALUE, l);		\          if (sizeof (int) == sizeof (long))			\            asm_fprintf ((FILE), "%I$%x", (int) l);		\          else							\            asm_fprintf ((FILE), "%I$%lx", l);			\        }							\     } while (0)/* Output a double value (represented as a C double) as an immediate operand.   This macro is a 68k-specific macro.  */#undef ASM_OUTPUT_DOUBLE_OPERAND #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE)				\ do { char dstr[30];							\      REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr);			\      asm_fprintf (FILE, "%I%s", dstr);					\    } while (0)/* Note, long double immediate operands are not actually   generated by m68k.md.  */#undef ASM_OUTPUT_LONG_DOUBLE_OPERAND#define ASM_OUTPUT_LONG_DOUBLE_OPERAND(FILE,VALUE)			\ do { char dstr[30];							\      REAL_VALUE_TO_DECIMAL (VALUE, "%.20g", dstr);			\      asm_fprintf (FILE, "%I%s", dstr);					\    } while (0)#undef ASM_OUTPUT_COMMON#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \( fputs ("\t.comm ", (FILE)),			\  assemble_name ((FILE), (NAME)),		\  fprintf ((FILE), ",%u\n", (ROUNDED)))#undef ASM_OUTPUT_LOCAL#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)	\  do {							\    int align = exact_log2 (ROUNDED);			\    /*fprintf ((FILE), "\tsection 14\n");  */               \    data_section ();					\    ASM_OUTPUT_ALIGN ((FILE), align)                    \    ASM_OUTPUT_LABEL ((FILE), (NAME));			\    fprintf ((FILE), "\tdcb.b %u,0\n", (ROUNDED));	\    /* fprintf ((FILE), "\tsection 10\n"); */             \  } while (0)#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, "(.L%d,pc,%s.w",				\		     CODE_LABEL_NUMBER (XEXP (addr, 0)),		\		     reg_names[REGNO (XEXP (ireg, 0))]); 		\	  else								\	    fprintf (FILE, "(.L%d,pc,%s.l",				\		     CODE_LABEL_NUMBER (XEXP (addr, 0)),		\		     reg_names[REGNO (ireg)]);				\	  if (scale != 1) fprintf (FILE, "*%d", scale);			\	  putc (')', FILE);						\	  break; }							\	if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF      \	    && ! (flag_pic && breg == pic_offset_table_rtx))            \	  {                                                             \	    fprintf (FILE, "(.L%d,pc,%s.l", 	                        \			 CODE_LABEL_NUMBER (XEXP (addr, 0)),            \			 reg_names[REGNO (breg)]);                      \	    putc (')', FILE);                                           \	    break; }                                                    \      if (ireg != 0 || breg != 0)					\	{ int scale = 1;						\	  if (breg == 0)						\	    abort ();							\          putc ('(', FILE); 	     				        \	  if (addr != 0)						\	    {                                                           \	      output_addr_const (FILE, addr);				\	      putc (',', FILE); 					\	    }    							\	  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, "(.L%d,pc,%s.w)",				\		   CODE_LABEL_NUMBER (XEXP (addr, 0)),			\		   reg_names[REGNO (reg1)]);				\	  break; }							\    default:								\      if (GET_CODE (addr) == CONST_INT					\	  && INTVAL (addr) < 0x8000					\	  && INTVAL (addr) >= -0x8000)					\	fprintf (FILE, "%d.w", INTVAL (addr));				\      else								\        output_addr_const (FILE, addr);					\    }}#endif /* ! use gas */			

⌨️ 快捷键说明

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