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

📄 tm-m68k.h

📁 这是完整的gcc源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
   It need not be very fast code.  */#define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \  fprintf (FILE, "\tmovel %s,sp@-\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, "\tmovel sp@+,%s\n", reg_names[REGNO])/* 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.)  */#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \  fprintf (FILE, "\t.long L%d\n", VALUE)/* This is how to output an element of a case-vector that is relative.  */#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)  \  fprintf (FILE, "\t.word L%d-L%d\n", VALUE, REL)/* 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)	\  if ((LOG) == 1)			\    fprintf (FILE, "\t.even\n");	\  else if ((LOG) != 0)			\    abort ();#define ASM_OUTPUT_SKIP(FILE,SIZE)  \  fprintf (FILE, "\t.skip %u\n", (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", (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", (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)))/* Define the parentheses used to group arithmetic operations   in assembler code.  */#define ASM_OPEN_PAREN "("#define ASM_CLOSE_PAREN ")"/* Define results of standard character escape sequences.  */#define TARGET_BELL 007#define TARGET_BS 010#define TARGET_TAB 011#define TARGET_NEWLINE 012#define TARGET_VT 013#define TARGET_FF 014#define TARGET_CR 015/* Output a float value (represented as a C double) as an immediate operand.   This macro is a 68k-specific macro.  */#define ASM_OUTPUT_FLOAT_OPERAND(FILE,VALUE)				\  fprintf (FILE, "#0r%.9g", (VALUE))/* Output a double value (represented as a C double) as an immediate operand.   This macro is a 68k-specific macro.  */#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE)				\  fprintf (FILE, "#0r%.20g", (VALUE))/* Print operand X (an rtx) in assembler syntax to file FILE.   CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.   For `%' followed by punctuation, CODE is the punctuation and X is null.   On the 68000, we use several CODE characters:   '.' for dot needed in Motorola-style opcode names.   '-' for an operand pushing on the stack:       sp@-, -(sp) or -(%sp) depending on the style of syntax.   '+' for an operand pushing on the stack:       sp@+, (sp)+ or (%sp)+ depending on the style of syntax.   '@' for a reference to the top word on the stack:       sp@, (sp) or (%sp) depending on the style of syntax.   '#' for an immediate operand prefix (# in MIT and Motorola syntax       but & in SGS syntax).   '!' for the cc register (used in an `and to cc' insn).   'b' for byte insn (no effect, on the Sun; this is for the ISI).   'd' to force memory addressing to be absolute, not relative.   'f' for float insn (print a CONST_DOUBLE as a float rather than in hex)   'w' for FPA insn (print a CONST_DOUBLE as a SunFPA constant rather       than directly).  Second part of 'y' below.   'x' for float insn (print a CONST_DOUBLE as a float rather than in hex),       or print pair of registers as rx:ry.   'y' for a FPA insn (print pair of registers as rx:ry).  This also outputs       CONST_DOUBLE's as SunFPA constant RAM registers if       possible, so it should not be used except for the SunFPA. */#define PRINT_OPERAND_PUNCT_VALID_P(CODE)				\  ((CODE) == '.' || (CODE) == '#' || (CODE) == '-'			\   || (CODE) == '+' || (CODE) == '@' || (CODE) == '!')/* This assumes the compiler is running on a big-endian machine.   The support for the other case is left for version 2.  */#define PRINT_OPERAND_EXTRACT_FLOAT(X)					\      u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X);#ifdef CROSS_COMPILER#define PRINT_OPERAND_PRINT_FLOAT(CODE, FILE)   \  ASM_OUTPUT_FLOAT_OPERAND (FILE, u1.f);#else#define PRINT_OPERAND_PRINT_FLOAT(CODE, FILE)   \{ if (CODE == 'f')							\    ASM_OUTPUT_FLOAT_OPERAND (FILE, u1.f);				\  else									\    fprintf (FILE, "#0x%x", u1.i); }#endif#define PRINT_OPERAND(FILE, X, CODE)  \{ int i;								\  if (CODE == '.') ;							\  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)						\    { if (REGNO (X) < 16 && (CODE == 'y' || CODE == 'x') && GET_MODE (X) == DFmode)	\        fprintf (FILE, "%s:%s", reg_names[REGNO (X)], reg_names[REGNO (X)+1]); \      else								\        fprintf (FILE, "%s", reg_names[REGNO (X)]);			\    }									\  else if (GET_CODE (X) == MEM)						\    {									\      output_address (XEXP (X, 0));					\      if (CODE == 'd' && ! TARGET_68020					\	  && CONSTANT_ADDRESS_P (XEXP (X, 0))				\	  && !(GET_CODE (XEXP (X, 0)) == CONST_INT			\	       && INTVAL (XEXP (X, 0)) < 0x8000				\	       && INTVAL (XEXP (X, 0)) >= -0x8000))			\	fprintf (FILE, ":l");						\    }									\  else if ((CODE == 'y' || CODE == 'w')					\	   && GET_CODE(X) == CONST_DOUBLE				\	   && (i = standard_sun_fpa_constant_p (X)))			\    fprintf (FILE, "%%%d", i & 0x1ff);					\  else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)	\    { union { double d; int i[2]; } u;					\      union { float f; int i; } u1;					\      PRINT_OPERAND_EXTRACT_FLOAT (X);					\      u1.f = u.d;							\      PRINT_OPERAND_PRINT_FLOAT (CODE, FILE); }				\  else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != DImode)	\    { union { double d; int i[2]; } u;					\      PRINT_OPERAND_EXTRACT_FLOAT (X);					\      ASM_OUTPUT_DOUBLE_OPERAND (FILE, u.d); }				\  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 m68k.md   generates a label LInnn: on such an insn.  */#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, "pc@(L%d-LI%d-2:b,%s:w",			\		     CODE_LABEL_NUMBER (XEXP (addr, 0)),		\		     CODE_LABEL_NUMBER (XEXP (addr, 0)),		\		     reg_names[REGNO (XEXP (ireg, 0))]); 		\	  else								\	    fprintf (FILE, "pc@(L%d-LI%d-2:b,%s:l",			\		     CODE_LABEL_NUMBER (XEXP (addr, 0)),		\		     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)	\        { fprintf (FILE, "pc@(L%d-LI%d-2:b,%s:l",			\		   CODE_LABEL_NUMBER (XEXP (addr, 0)),			\		   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 ();							\	  if (addr && GET_CODE (addr) == LABEL_REF) abort ();		\	  fprintf (FILE, "%s@(", reg_names[REGNO (breg)]);		\	  if (addr != 0)						\	    output_addr_const (FILE, addr);				\	  if (addr != 0 && 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, "pc@(L%d-LI%d-2:b,%s:l)",			\		   CODE_LABEL_NUMBER (XEXP (addr, 0)),			\		   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);					\    }}/*Local variables:version-control: tEnd:*/

⌨️ 快捷键说明

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