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

📄 m68k.h

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 H
📖 第 1 页 / 共 4 页
字号:
      N_("Disable separate data segment") },				\    { "id-shared-library", MASK_ID_SHARED_LIBRARY,			\      N_("Enable ID based shared library") },				\    { "no-id-shared-library", -MASK_ID_SHARED_LIBRARY,			\      N_("Disable ID based shared library") },				\    { "pcrel", MASK_PCREL,						\      N_("Generate pc-relative code") },				\    { "strict-align", -MASK_NO_STRICT_ALIGNMENT,			\      N_("Do not use unaligned memory references") },			\    { "no-strict-align", MASK_NO_STRICT_ALIGNMENT,			\      N_("Use unaligned memory references") },				\    { "rtd", MASK_RTD,							\      N_("Use different calling convention using 'rtd'") },		\    { "nortd", - MASK_RTD,						\      N_("Use normal calling convention") },				\    SUBTARGET_SWITCHES							\    { "", TARGET_DEFAULT, "" }}/* TARGET_DEFAULT is defined in m68k-none.h, netbsd.h, etc.  */#define TARGET_OPTIONS							\{									\  { "shared-library-id=",	&m68k_library_id_string,		\    N_("ID of shared library to build"), 0},				\  SUBTARGET_OPTIONS							\}#define OVERRIDE_OPTIONS   override_options()/* These are meant to be redefined in the host dependent files */#define SUBTARGET_SWITCHES#define SUBTARGET_OPTIONS#define SUBTARGET_OVERRIDE_OPTIONS/* target machine storage layout */#define LONG_DOUBLE_TYPE_SIZE 80/* Set the value of FLT_EVAL_METHOD in float.h.  When using 68040 fp   instructions, we get proper intermediate rounding, otherwise we   get extended precision results.  */#define TARGET_FLT_EVAL_METHOD ((TARGET_68040_ONLY || ! TARGET_68881) ? 0 : 2)#define BITS_BIG_ENDIAN 1#define BYTES_BIG_ENDIAN 1#define WORDS_BIG_ENDIAN 1#define UNITS_PER_WORD 4#define PARM_BOUNDARY (TARGET_SHORT ? 16 : 32)#define STACK_BOUNDARY 16#define FUNCTION_BOUNDARY 16#define EMPTY_FIELD_BOUNDARY 16/* No data type wants to be aligned rounder than this.   Most published ABIs say that ints should be aligned on 16 bit   boundaries, but CPUs with 32-bit busses get better performance   aligned on 32-bit boundaries.  ColdFires without a misalignment   module require 32-bit alignment.  */#define BIGGEST_ALIGNMENT (TARGET_ALIGN_INT ? 32 : 16)#define STRICT_ALIGNMENT (TARGET_STRICT_ALIGNMENT)#define INT_TYPE_SIZE (TARGET_SHORT ? 16 : 32)/* Define these to avoid dependence on meaning of `int'.  */#define WCHAR_TYPE "long int"#define WCHAR_TYPE_SIZE 32/* Maximum number of library IDs we permit with -mid-shared-library.  */#define MAX_LIBRARY_ID 255/* Standard register usage.  *//* For the m68k, we give the data registers numbers 0-7,   the address registers numbers 010-017 (8-15),   and the 68881 floating point registers numbers 020-027 (16-24).   We also have a fake `arg-pointer' register 030 (25) used for   register elimination.  */#define FIRST_PSEUDO_REGISTER 25/* All m68k targets (except AmigaOS) use %a5 as the PIC register  */#define PIC_OFFSET_TABLE_REGNUM (flag_pic ? 13 : INVALID_REGNUM)/* 1 for registers that have pervasive standard uses   and are not available for the register allocator.   On the m68k, only the stack pointer is such.   Our fake arg-pointer is obviously fixed as well.  */#define FIXED_REGISTERS        \ {/* Data registers.  */       \  0, 0, 0, 0, 0, 0, 0, 0,      \                               \  /* Address registers.  */    \  0, 0, 0, 0, 0, 0, 0, 1,      \                               \  /* Floating point registers  \     (if available).  */       \  0, 0, 0, 0, 0, 0, 0, 0,      \                               \  /* Arg pointer.  */          \  1 }/* 1 for registers not available across function calls.   These must include the FIXED_REGISTERS and also any   registers that can be used without being saved.   The latter must include the registers where values are returned   and the register where structure-value addresses are passed.   Aside from that, you can include as many other registers as you like.  */#define CALL_USED_REGISTERS     \ {/* Data registers.  */        \  1, 1, 0, 0, 0, 0, 0, 0,       \                                \  /* Address registers.  */     \  1, 1, 0, 0, 0, 0, 0, 1,       \                                \  /* Floating point registers   \     (if available).  */        \  1, 1, 0, 0, 0, 0, 0, 0,       \                                \  /* Arg pointer.  */           \  1 }#define REG_ALLOC_ORDER		\{ /* d0/d1/a0/a1 */		\  0, 1, 8, 9,			\  /* d2-d7 */			\  2, 3, 4, 5, 6, 7,		\  /* a2-a7/arg */		\  10, 11, 12, 13, 14, 15, 24,	\  /* fp0-fp7 */			\  16, 17, 18, 19, 20, 21, 22, 23\}/* Make sure everything's fine if we *don't* have a given processor.   This assumes that putting a register in fixed_regs will keep the   compiler's mitts completely off it.  We don't bother to zero it out   of register classes.  */#define CONDITIONAL_REGISTER_USAGE				\{								\  int i;							\  HARD_REG_SET x;						\  if (! TARGET_68881)						\    {								\      COPY_HARD_REG_SET (x, reg_class_contents[(int)FP_REGS]);	\      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)		\        if (TEST_HARD_REG_BIT (x, i))				\	  fixed_regs[i] = call_used_regs[i] = 1;		\    }								\  if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)		\    fixed_regs[PIC_OFFSET_TABLE_REGNUM]				\      = call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;		\}/* On the m68k, ordinary registers hold 32 bits worth;   for the 68881 registers, a single register is always enough for   anything that can be stored in them at all.  */#define HARD_REGNO_NREGS(REGNO, MODE)   \  ((REGNO) >= 16 ? GET_MODE_NUNITS (MODE)	\   : ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))/* A C expression that is nonzero if hard register NEW_REG can be   considered for use as a rename register for OLD_REG register.  */#define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \  m68k_hard_regno_rename_ok (OLD_REG, NEW_REG)/* On the m68k, the cpu registers can hold any mode but the 68881 registers   can hold only SFmode or DFmode.  */#define HARD_REGNO_MODE_OK(REGNO, MODE) \  (((REGNO) < 16					\    && !((REGNO) < 8 && (REGNO) + GET_MODE_SIZE (MODE) / 4 > 8))	\   || ((REGNO) >= 16 && (REGNO) < 24				        \       && (GET_MODE_CLASS (MODE) == MODE_FLOAT		\	   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)		\       && GET_MODE_UNIT_SIZE (MODE) <= 12))#define MODES_TIEABLE_P(MODE1, MODE2)			\  (! TARGET_68881					\   || ((GET_MODE_CLASS (MODE1) == MODE_FLOAT		\	|| GET_MODE_CLASS (MODE1) == MODE_COMPLEX_FLOAT)	\       == (GET_MODE_CLASS (MODE2) == MODE_FLOAT		\	   || GET_MODE_CLASS (MODE2) == MODE_COMPLEX_FLOAT)))/* Specify the registers used for certain standard purposes.   The values of these macros are register numbers.  */#define STACK_POINTER_REGNUM 15/* Most m68k targets use %a6 as a frame pointer.  The AmigaOS   ABI uses %a6 for shared library calls, therefore the frame   pointer is shifted to %a5 on this target.  */#define FRAME_POINTER_REGNUM 14#define FRAME_POINTER_REQUIRED 0/* Base register for access to arguments of the function. * This isn't a hardware register. It will be eliminated to the * stack pointer or frame pointer. */#define ARG_POINTER_REGNUM 24#define STATIC_CHAIN_REGNUM 8/* Register in which address to store a structure value   is passed to a function.  */#define M68K_STRUCT_VALUE_REGNUM 9/* The m68k has three kinds of registers, so eight classes would be   a complete set.  One of them is not needed.  */enum reg_class {  NO_REGS, DATA_REGS,  ADDR_REGS, FP_REGS,  GENERAL_REGS, DATA_OR_FP_REGS,  ADDR_OR_FP_REGS, ALL_REGS,  LIM_REG_CLASSES };#define N_REG_CLASSES (int) LIM_REG_CLASSES#define REG_CLASS_NAMES \ { "NO_REGS", "DATA_REGS",              \   "ADDR_REGS", "FP_REGS",              \   "GENERAL_REGS", "DATA_OR_FP_REGS",   \   "ADDR_OR_FP_REGS", "ALL_REGS" }#define REG_CLASS_CONTENTS \{					\  {0x00000000},  /* NO_REGS */		\  {0x000000ff},  /* DATA_REGS */	\  {0x0100ff00},  /* ADDR_REGS */	\  {0x00ff0000},  /* FP_REGS */		\  {0x0100ffff},  /* GENERAL_REGS */	\  {0x00ff00ff},  /* DATA_OR_FP_REGS */	\  {0x01ffff00},  /* ADDR_OR_FP_REGS */	\  {0x01ffffff},  /* ALL_REGS */		\}extern enum reg_class regno_reg_class[];#define REGNO_REG_CLASS(REGNO) (regno_reg_class[(REGNO)])#define INDEX_REG_CLASS GENERAL_REGS#define BASE_REG_CLASS ADDR_REGS/* We do a trick here to modify the effective constraints on the   machine description; we zorch the constraint letters that aren't   appropriate for a specific target.  This allows us to guarantee   that a specific kind of register will not be used for a given target   without fiddling with the register classes above.  */#define REG_CLASS_FROM_LETTER(C) \  ((C) == 'a' ? ADDR_REGS :			\   ((C) == 'd' ? DATA_REGS :			\    ((C) == 'f' ? (TARGET_68881 ? FP_REGS :	\		   NO_REGS) :			\     NO_REGS)))/* For the m68k, `I' is used for the range 1 to 8   allowed as immediate shift counts and in addq.   `J' is used for the range of signed numbers that fit in 16 bits.   `K' is for numbers that moveq can't handle.   `L' is for range -8 to -1, range of values that can be added with subq.   `M' is for numbers that moveq+notb can't handle.   'N' is for range 24 to 31, rotatert:SI 8 to 1 expressed as rotate.   'O' is for 16 (for rotate using swap).   'P' is for range 8 to 15, rotatert:HI 8 to 1 expressed as rotate.  */#define CONST_OK_FOR_LETTER_P(VALUE, C) \  ((C) == 'I' ? (VALUE) > 0 && (VALUE) <= 8 : \   (C) == 'J' ? (VALUE) >= -0x8000 && (VALUE) <= 0x7FFF : \   (C) == 'K' ? (VALUE) < -0x80 || (VALUE) >= 0x80 : \   (C) == 'L' ? (VALUE) < 0 && (VALUE) >= -8 : \   (C) == 'M' ? (VALUE) < -0x100 || (VALUE) >= 0x100 : \   (C) == 'N' ? (VALUE) >= 24 && (VALUE) <= 31 : \   (C) == 'O' ? (VALUE) == 16 : \   (C) == 'P' ? (VALUE) >= 8 && (VALUE) <= 15 : 0)/* "G" defines all of the floating constants that are *NOT* 68881   constants.  This is so 68881 constants get reloaded and the   fpmovecr is used.  */#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)  \  ((C) == 'G' ? ! (TARGET_68881 && standard_68881_constant_p (VALUE)) : 0 )/* `Q' means address register indirect addressing mode.   `S' is for operands that satisfy 'm' when -mpcrel is in effect.   `T' is for operands that satisfy 's' when -mpcrel is not in effect.   `U' is for register offset addressing.  */#define EXTRA_CONSTRAINT(OP,CODE)			\  (((CODE) == 'S')					\   ? (TARGET_PCREL					\      && GET_CODE (OP) == MEM				\      && (GET_CODE (XEXP (OP, 0)) == SYMBOL_REF		\	  || GET_CODE (XEXP (OP, 0)) == LABEL_REF	\	  || GET_CODE (XEXP (OP, 0)) == CONST))		\   : 							\  (((CODE) == 'T')					\   ? ( !TARGET_PCREL 					\      && (GET_CODE (OP) == SYMBOL_REF			\	  || GET_CODE (OP) == LABEL_REF			\	  || GET_CODE (OP) == CONST))			\   :							\  (((CODE) == 'Q')					\   ? (GET_CODE (OP) == MEM 				\      && GET_CODE (XEXP (OP, 0)) == REG)		\   :							\  (((CODE) == 'U')					\   ? (GET_CODE (OP) == MEM 				\      && GET_CODE (XEXP (OP, 0)) == PLUS		\      && GET_CODE (XEXP (XEXP (OP, 0), 0)) == REG	\      && GET_CODE (XEXP (XEXP (OP, 0), 1)) == CONST_INT) \   :							\   0))))/* On the m68k, use a data reg if possible when the   value is a constant in the range where moveq could be used   and we ensure that QImodes are reloaded into data regs.  */#define PREFERRED_RELOAD_CLASS(X,CLASS)  \  ((GET_CODE (X) == CONST_INT			\    && (unsigned) (INTVAL (X) + 0x80) < 0x100	\    && (CLASS) != ADDR_REGS)			\   ? DATA_REGS					\   : (GET_MODE (X) == QImode && (CLASS) != ADDR_REGS) \   ? DATA_REGS					\

⌨️ 快捷键说明

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