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

📄 m68k.h

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 H
📖 第 1 页 / 共 4 页
字号:
    { if (GET_CODE (XEXP (X, 1)) == CONST_INT				\	  && (TARGET_68020 || (unsigned) INTVAL (XEXP (X, 1)) + 0x80 < 0x100))		\	{ rtx go_temp = XEXP (X, 0); GO_IF_INDEXING (go_temp, ADDR); }	\      if (GET_CODE (XEXP (X, 0)) == CONST_INT				\	  && (TARGET_68020 || (unsigned) INTVAL (XEXP (X, 0)) + 0x80 < 0x100))		\	{ rtx go_temp = XEXP (X, 1); GO_IF_INDEXING (go_temp, ADDR); } } }/* ColdFire/5200 does not allow HImode index registers.  */#define LEGITIMATE_INDEX_REG_P(X)   \  ((GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X))	\   || (! TARGET_COLDFIRE					\       && GET_CODE (X) == SIGN_EXTEND			\       && GET_CODE (XEXP (X, 0)) == REG			\       && GET_MODE (XEXP (X, 0)) == HImode		\       && REG_OK_FOR_INDEX_P (XEXP (X, 0)))		\   || (GET_CODE (X) == SUBREG				\       && GET_CODE (SUBREG_REG (X)) == REG		\       && REG_OK_FOR_INDEX_P (SUBREG_REG (X))))#define LEGITIMATE_INDEX_P(X)   \   (LEGITIMATE_INDEX_REG_P (X)				\    || ((TARGET_68020 || TARGET_COLDFIRE) && GET_CODE (X) == MULT \	&& LEGITIMATE_INDEX_REG_P (XEXP (X, 0))		\	&& GET_CODE (XEXP (X, 1)) == CONST_INT		\	&& (INTVAL (XEXP (X, 1)) == 2			\	    || INTVAL (XEXP (X, 1)) == 4		\	    || (INTVAL (XEXP (X, 1)) == 8 && !TARGET_COLDFIRE))))/* If pic, we accept INDEX+LABEL, which is what do_tablejump makes.  */#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)				\{ GO_IF_NONINDEXED_ADDRESS (X, ADDR);					\  GO_IF_INDEXED_ADDRESS (X, ADDR);					\  if (flag_pic && MODE == CASE_VECTOR_MODE && GET_CODE (X) == PLUS	\      && LEGITIMATE_INDEX_P (XEXP (X, 0))				\      && GET_CODE (XEXP (X, 1)) == LABEL_REF)				\    goto ADDR; }/* Don't call memory_address_noforce for the address to fetch   the switch offset.  This address is ok as it stands (see above),   but memory_address_noforce would alter it.  */#define PIC_CASE_VECTOR_ADDRESS(index) index/* For the 68000, we handle X+REG by loading X into a register R and   using R+REG.  R will go in an address reg and indexing will be used.   However, if REG is a broken-out memory address or multiplication,   nothing needs to be done because REG can certainly go in an address reg.  */#define COPY_ONCE(Y) if (!copied) { Y = copy_rtx (Y); copied = ch = 1; }#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN)   \{ register int ch = (X) != (OLDX);					\  if (GET_CODE (X) == PLUS)						\    { int copied = 0;							\      if (GET_CODE (XEXP (X, 0)) == MULT)				\	{ COPY_ONCE (X); XEXP (X, 0) = force_operand (XEXP (X, 0), 0);}	\      if (GET_CODE (XEXP (X, 1)) == MULT)				\	{ COPY_ONCE (X); XEXP (X, 1) = force_operand (XEXP (X, 1), 0);}	\      if (ch && GET_CODE (XEXP (X, 1)) == REG				\	  && GET_CODE (XEXP (X, 0)) == REG)				\	goto WIN;							\      if (ch) { GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); }		\      if (GET_CODE (XEXP (X, 0)) == REG					\	       || (GET_CODE (XEXP (X, 0)) == SIGN_EXTEND		\		   && GET_CODE (XEXP (XEXP (X, 0), 0)) == REG		\		   && GET_MODE (XEXP (XEXP (X, 0), 0)) == HImode))	\	{ register rtx temp = gen_reg_rtx (Pmode);			\	  register rtx val = force_operand (XEXP (X, 1), 0);		\	  emit_move_insn (temp, val);					\	  COPY_ONCE (X);						\	  XEXP (X, 1) = temp;						\	  goto WIN; }							\      else if (GET_CODE (XEXP (X, 1)) == REG				\	       || (GET_CODE (XEXP (X, 1)) == SIGN_EXTEND		\		   && GET_CODE (XEXP (XEXP (X, 1), 0)) == REG		\		   && GET_MODE (XEXP (XEXP (X, 1), 0)) == HImode))	\	{ register rtx temp = gen_reg_rtx (Pmode);			\	  register rtx val = force_operand (XEXP (X, 0), 0);		\	  emit_move_insn (temp, val);					\	  COPY_ONCE (X);						\	  XEXP (X, 0) = temp;						\	  goto WIN; }}}/* On the 68000, only predecrement and postincrement address depend thus   (the amount of decrement or increment being 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#define CASE_VECTOR_MODE HImode#define CASE_VECTOR_PC_RELATIVE 1#define DEFAULT_SIGNED_CHAR 1#define MOVE_MAX 4#define SLOW_BYTE_ACCESS 0#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1#define STORE_FLAG_VALUE (-1)#define Pmode SImode#define FUNCTION_MODE QImode/* Tell final.c how to eliminate redundant test instructions.  *//* Here we define machine-dependent flags and fields in cc_status   (see `conditions.h').  *//* Set if the cc value is actually in the 68881, so a floating point   conditional branch must be output.  */#define CC_IN_68881 04000/* On the 68000, all the insns to store in an address register fail to   set the cc's.  However, in some cases these instructions can make it   possibly invalid to use the saved cc's.  In those cases we clear out   some or all of the saved cc's so they won't be used.  */#define NOTICE_UPDATE_CC(EXP,INSN) notice_update_cc (EXP, INSN)#define OUTPUT_JUMP(NORMAL, FLOAT, NO_OV)  \do { if (cc_prev_status.flags & CC_IN_68881)			\    return FLOAT;						\  if (cc_prev_status.flags & CC_NO_OVERFLOW)			\    return NO_OV;						\  return NORMAL; } while (0)/* Control the assembler format that we output.  */#define ASM_APP_ON "#APP\n"#define ASM_APP_OFF "#NO_APP\n"#define TEXT_SECTION_ASM_OP "\t.text"#define DATA_SECTION_ASM_OP "\t.data"#define GLOBAL_ASM_OP "\t.globl\t"#define REGISTER_PREFIX ""#define LOCAL_LABEL_PREFIX ""#define USER_LABEL_PREFIX "_"#define IMMEDIATE_PREFIX "#"#define REGISTER_NAMES \{REGISTER_PREFIX"d0", REGISTER_PREFIX"d1", REGISTER_PREFIX"d2",	\ REGISTER_PREFIX"d3", REGISTER_PREFIX"d4", REGISTER_PREFIX"d5",	\ REGISTER_PREFIX"d6", REGISTER_PREFIX"d7",			\ REGISTER_PREFIX"a0", REGISTER_PREFIX"a1", REGISTER_PREFIX"a2", \ REGISTER_PREFIX"a3", REGISTER_PREFIX"a4", REGISTER_PREFIX"a5", \ REGISTER_PREFIX"a6", REGISTER_PREFIX"sp",			\ REGISTER_PREFIX"fp0", REGISTER_PREFIX"fp1", REGISTER_PREFIX"fp2", \ REGISTER_PREFIX"fp3", REGISTER_PREFIX"fp4", REGISTER_PREFIX"fp5", \ REGISTER_PREFIX"fp6", REGISTER_PREFIX"fp7", REGISTER_PREFIX"argptr" }#define M68K_FP_REG_NAME REGISTER_PREFIX"fp"/* Return a register name by index, handling %fp nicely.   We don't replace %fp for targets that don't map it to %a6   since it may confuse GAS.  */#define M68K_REGNAME(r) ( \  ((FRAME_POINTER_REGNUM == 14) \    && ((r) == FRAME_POINTER_REGNUM) \    && frame_pointer_needed) ? \    M68K_FP_REG_NAME : reg_names[(r)])/* On the Sun-3, the floating point registers have numbers   18 to 25, not 16 to 23 as they do in the compiler.  */#define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2)/* Before the prologue, RA is at 0(%sp).  */#define INCOMING_RETURN_ADDR_RTX \  gen_rtx_MEM (VOIDmode, gen_rtx_REG (VOIDmode, STACK_POINTER_REGNUM))/* We must not use the DBX register numbers for the DWARF 2 CFA column   numbers because that maps to numbers beyond FIRST_PSEUDO_REGISTER.   Instead use the identity mapping.  */#define DWARF_FRAME_REGNUM(REG) REG/* Before the prologue, the top of the frame is at 4(%sp).  */#define INCOMING_FRAME_SP_OFFSET 4/* Describe how we implement __builtin_eh_return.  */#define EH_RETURN_DATA_REGNO(N) \  ((N) < 2 ? (N) : INVALID_REGNUM)#define EH_RETURN_STACKADJ_RTX	gen_rtx_REG (Pmode, 8)#define EH_RETURN_HANDLER_RTX					    \  gen_rtx_MEM (Pmode,						    \	       gen_rtx_PLUS (Pmode, arg_pointer_rtx,		    \			     plus_constant (EH_RETURN_STACKADJ_RTX, \					    UNITS_PER_WORD)))/* Select a format to encode pointers in exception handling data.  CODE   is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is   true if the symbol may be affected by dynamic relocations.  */#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL)			   \  (flag_pic								   \   ? ((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4 \   : DW_EH_PE_absptr)#define ASM_OUTPUT_LABELREF(FILE,NAME)	\  asm_fprintf (FILE, "%U%s", NAME)#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)	\  sprintf (LABEL, "*%s%s%ld", LOCAL_LABEL_PREFIX, PREFIX, (long)(NUM))#define ASM_OUTPUT_REG_PUSH(FILE,REGNO)  \  asm_fprintf (FILE, "\tmovel %s,%Rsp@-\n", reg_names[REGNO])#define ASM_OUTPUT_REG_POP(FILE,REGNO)  \  asm_fprintf (FILE, "\tmovel %Rsp@+,%s\n", reg_names[REGNO])/* The m68k does not use absolute case-vectors, but we must define this macro   anyway.  */#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \  asm_fprintf (FILE, "\t.long %LL%d\n", VALUE)#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)  \  asm_fprintf (FILE, "\t.word %LL%d-%LL%d\n", VALUE, REL)/* We don't have a way to align to more than a two-byte boundary, so do the   best we can and don't complain.  */#define ASM_OUTPUT_ALIGN(FILE,LOG)	\  if ((LOG) >= 1)			\    fprintf (FILE, "\t.even\n");#define ASM_OUTPUT_SKIP(FILE,SIZE)  \  fprintf (FILE, "\t.skip %u\n", (int)(SIZE))#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \( fputs (".comm ", (FILE)),			\  assemble_name ((FILE), (NAME)),		\  fprintf ((FILE), ",%u\n", (int)(ROUNDED)))#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \( fputs (".lcomm ", (FILE)),			\  assemble_name ((FILE), (NAME)),		\  fprintf ((FILE), ",%u\n", (int)(ROUNDED)))/* Output a float value (represented as a C double) as an immediate operand.   This macro is m68k-specific.  */#define ASM_OUTPUT_FLOAT_OPERAND(CODE,FILE,VALUE)		\ do {								\      if (CODE == 'f')						\        {							\          char dstr[30];					\	  real_to_decimal (dstr, &(VALUE), sizeof (dstr), 9, 0); \          asm_fprintf ((FILE), "%I0r%s", dstr);			\        }							\      else							\        {							\          long l;						\          REAL_VALUE_TO_TARGET_SINGLE (VALUE, l);		\          asm_fprintf ((FILE), "%I0x%lx", l);			\        }							\     } while (0)/* Output a double value (represented as a C double) as an immediate operand.   This macro is m68k-specific.  */#define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE)				\ do { char dstr[30];							\      real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1);		\      asm_fprintf (FILE, "%I0r%s", dstr);				\    } while (0)/* Note, long double immediate operands are not actually   generated by m68k.md.  */#define ASM_OUTPUT_LONG_DOUBLE_OPERAND(FILE,VALUE)			\ do { char dstr[30];							\      real_to_decimal (dstr, &(VALUE), sizeof (dstr), 0, 1);		\      asm_fprintf (FILE, "%I0r%s", dstr);				\    } while (0)/* 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 fpcr register (used in some float-to-fixed conversions).   '$' for the letter `s' in an op code, but only on the 68040.   '&' for the letter `d' in an op code, but only on the 68040.   '/' for register prefix needed by longlong.h.   '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)   'o' for operands to go directly to output_operand_address (bypassing       print_operand_address--used only for SYMBOL_REFs under TARGET_PCREL)   'x' for float insn (print a CONST_DOUBLE as a float rather than in hex),       or print pair of registers as rx:ry.  */#define PRINT_OPERAND_PUNCT_VALID_P(CODE)				\  ((CODE) == '.' || (CODE) == '#' || (CODE) == '-'			\   || (CODE) == '+' || (CODE) == '@' || (CODE) == '!'			\   || (CODE) == '$' || (CODE) == '&' || (CODE) == '/')/* See m68k.c for the m68k specific codes.  */#define PRINT_OPERAND(FILE, X, CODE) print_operand (FILE, X, CODE)#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)/* Variables in m68k.c */extern const char *m68k_library_id_string;extern int m68k_last_compare_had_fp_operands;/* Define the codes that are matched by predicates in m68k.c.  */#define PREDICATE_CODES							\  {"general_src_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,	\			   LABEL_REF, SUBREG, REG, MEM}},		\  {"nonimmediate_src_operand", {SUBREG, REG, MEM}},			\  {"memory_src_operand", {SUBREG, MEM}},				\  {"not_sp_operand", {SUBREG, REG, MEM}},				\  {"pcrel_address", {SYMBOL_REF, LABEL_REF, CONST}},			\  {"const_uint32_operand", {CONST_INT, CONST_DOUBLE}},			\  {"const_sint32_operand", {CONST_INT}},				\  {"valid_dbcc_comparison_p", {EQ, NE, GTU, LTU, GEU, LEU,		\			       GT, LT, GE, LE}},			\  {"extend_operator", {SIGN_EXTEND, ZERO_EXTEND}},			\  {"symbolic_operand", {SYMBOL_REF, LABEL_REF, CONST}},			\  {"post_inc_operand", {MEM}},						\  {"pre_dec_operand", {MEM}},

⌨️ 快捷键说明

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