📄 m68k.h
字号:
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 + -