📄 ns32k.h
字号:
&& MEM_REG (XEXP (xfoo0, 0)) \ && CONSTANT_ADDRESS_NO_LABEL_P (XEXP (xfoo0, 1)))) \ || (TARGET_SB && CONSTANT_ADDRESS_P (xfoo0))))/* Go to ADDR if X is a valid address not using indexing. (This much is the easy part.) */#define GO_IF_NONINDEXED_ADDRESS(X, ADDR) \{ \ if (INDIRECTABLE_1_ADDRESS_P (X)) goto ADDR; \ if (INDIRECTABLE_2_ADDRESS_P (X)) goto ADDR; \ if (GET_CODE (X) == PLUS) \ if (CONSTANT_ADDRESS_NO_LABEL_P (XEXP (X, 1))) \ if (INDIRECTABLE_2_ADDRESS_P (XEXP (X, 0))) \ goto ADDR; \}/* Go to ADDR if X is a valid address not using indexing. (This much is the easy part.) */#define GO_IF_INDEXING(X, MODE, ADDR) \{ register rtx xfoob = (X); \ if (GET_CODE (xfoob) == PLUS && INDEX_TERM_P (XEXP (xfoob, 0), MODE)) \ GO_IF_INDEXABLE_ADDRESS (XEXP (xfoob, 1), ADDR); \ if (GET_CODE (xfoob) == PLUS && INDEX_TERM_P (XEXP (xfoob, 1), MODE)) \ GO_IF_INDEXABLE_ADDRESS (XEXP (xfoob, 0), ADDR); } \#define GO_IF_INDEXABLE_ADDRESS(X, ADDR) \{ if (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) goto ADDR; \ if (INDIRECTABLE_2_ADDRESS_P (X)) goto ADDR; \ if (INDIRECTABLE_1_ADDRESS_P (X)) goto ADDR; \}/* 1 if PROD is either a reg times size of mode MODE or just a reg, if MODE is just one byte. Actually, on the ns32k, since the index mode is independent of the operand size, we can match more stuff... This macro's expansion uses the temporary variables xfoo0, xfoo1 and xfoo2 that must be declared in the surrounding context. */#define INDEX_TERM_P(PROD, MODE) \((GET_CODE (PROD) == REG && REG_OK_FOR_INDEX_P (PROD)) \ || (GET_CODE (PROD) == MULT \ && (xfoo0 = XEXP (PROD, 0), xfoo1 = XEXP (PROD, 1), \ (GET_CODE (xfoo1) == CONST_INT \ && GET_CODE (xfoo0) == REG \ && FITS_INDEX_RANGE (INTVAL (xfoo1)) \ && REG_OK_FOR_INDEX_P (xfoo0)))))#define FITS_INDEX_RANGE(X) \ ((xfoo2 = (unsigned)(X)-1), \ ((xfoo2 < 4 && xfoo2 != 2) || xfoo2 == 7))/* Note that xfoo0, xfoo1, xfoo2 are used in some of the submacros above. */#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \{ register rtx xfooy, xfoo0, xfoo1; \ unsigned xfoo2; \ xfooy = X; \ if (flag_pic && cfun && ! current_function_uses_pic_offset_table \ && global_symbolic_reference_mentioned_p (X, 1)) \ current_function_uses_pic_offset_table = 1; \ GO_IF_NONINDEXED_ADDRESS (xfooy, ADDR); \ if (GET_CODE (xfooy) == PLUS) \ { \ if (CONSTANT_ADDRESS_NO_LABEL_P (XEXP (xfooy, 1)) \ && GET_CODE (XEXP (xfooy, 0)) == PLUS) \ xfooy = XEXP (xfooy, 0); \ else if (CONSTANT_ADDRESS_NO_LABEL_P (XEXP (xfooy, 0)) \ && GET_CODE (XEXP (xfooy, 1)) == PLUS) \ xfooy = XEXP (xfooy, 1); \ GO_IF_INDEXING (xfooy, MODE, ADDR); \ } \ else if (INDEX_TERM_P (xfooy, MODE)) \ goto ADDR; \ else if (GET_CODE (xfooy) == PRE_DEC) \ { \ if (REGNO (XEXP (xfooy, 0)) == STACK_POINTER_REGNUM) goto ADDR; \ } \}/* Nonzero if the constant value X is a legitimate general operand when generating PIC code. It is given that flag_pic is on and that X satisfies CONSTANT_P or is a CONST_DOUBLE. */#define LEGITIMATE_PIC_OPERAND_P(X) \ (((! current_function_uses_pic_offset_table \ && symbolic_reference_mentioned_p (X))? \ (current_function_uses_pic_offset_table = 1):0 \ ), (! SYMBOLIC_CONST (X) \ || GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == LABEL_REF))#define SYMBOLIC_CONST(X) \(GET_CODE (X) == SYMBOL_REF \ || GET_CODE (X) == LABEL_REF \ || (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))/* Go to LABEL if ADDR (a legitimate address expression) has an effect that depends on the machine mode it is used for. On the ns32k, 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;}/* Specify the machine mode that this machine uses for the index in the tablejump instruction. HI mode is more efficient but the range is not wide enough for all programs. */#define CASE_VECTOR_MODE SImode/* Define as C expression which evaluates to nonzero if the tablejump instruction expects the table to contain offsets from the address of the table. Do not define this if the table should contain absolute addresses. */#define CASE_VECTOR_PC_RELATIVE 1/* Define this as 1 if `char' should by default be signed; else as 0. */#define DEFAULT_SIGNED_CHAR 1/* Max number of bytes we can move from memory to memory in one reasonably fast instruction. */#define MOVE_MAX 4/* The number of scalar move insns which should be generated instead of a string move insn or a library call. We have a smart movmemsi insn */#define MOVE_RATIO 0#define STORE_RATIO (optimize_size ? 3 : 15)#define STORE_BY_PIECES_P(SIZE, ALIGN) \ (move_by_pieces_ninsns (SIZE, ALIGN, STORE_MAX_PIECES + 1) \ < (unsigned int) STORE_RATIO)/* Nonzero if access to memory by bytes is slow and undesirable. */#define SLOW_BYTE_ACCESS 0/* Define if shifts truncate the shift count which implies one can omit a sign-extension or zero-extension of a shift count. *//* #define SHIFT_COUNT_TRUNCATED *//* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits is done just by pretending it is already truncated. */#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1/* Specify the machine mode that pointers have. After generation of rtl, the compiler makes no further distinction between pointers and any other objects of this machine mode. */#define Pmode SImode/* A function address in a call instruction is a byte address (for indexing purposes) so give the MEM rtx a byte's mode. */#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'). *//* This bit means that what ought to be in the Z bit should be tested in the F bit. */#define CC_Z_IN_F 04000/* This bit means that what ought to be in the Z bit is complemented in the F bit. */#define CC_Z_IN_NOT_F 010000/* This bit means that the L bit indicates unordered (IEEE) comparison. */#define CC_UNORD 020000/* Store in cc_status the expressions that the condition codes will describe after execution of an instruction whose pattern is EXP. Do not alter them if the instruction would not alter the cc's. */#define NOTICE_UPDATE_CC(EXP, INSN) \ ns32k_notice_update_cc ((EXP), (INSN))/* Describe the costs of the following register moves which are discouraged: 1.) Moves between the Floating point registers and the frame pointer and stack pointer 2.) Moves between the stack pointer and the frame pointer 3.) Moves between the floating point and general registers These all involve two memory references. This is worse than a memory to memory move (default cost 4) */#define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \ register_move_cost (CLASS1, CLASS2)#define OUTPUT_JUMP(NORMAL, NO_OV) \{ if (cc_status.flags & CC_NO_OVERFLOW) \ return NO_OV; \ return NORMAL; }/* Dividing the output into sections *//* Output before read-only data. */#define TEXT_SECTION_ASM_OP "\t.text"/* Output before writable data. */#define DATA_SECTION_ASM_OP "\t.data"/* Define the output Assembly Language *//* Output to assembler file text saying following lines may contain character constants, extra white space, comments, etc. */#define ASM_APP_ON "#APP\n"/* Output to assembler file text saying following lines no longer contain unusual constructs. */#define ASM_APP_OFF "#NO_APP\n"/* Output of Data *//* This is how to output an assembler line defining an external/static address which is not in tree format (for collect.c). *//* The prefix to add to user-visible assembler symbols. */#define USER_LABEL_PREFIX "_"/* This is how to output an insn to push a register on the stack. It need not be very fast code. */#define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \ fprintf (FILE, "\tmovd %s,tos\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, "\tmovd tos,%s\n", reg_names[REGNO])/* This is how to output a command to make the user-level label named NAME defined for reference from other files. *//* Globalizing directive for a label. */#define GLOBAL_ASM_OP ".globl "/* This is how to store into the string LABEL the symbol_ref name of an internal numbered label where PREFIX is the class of label and NUM is the number within the class. This is suitable for output with `assemble_name'. */#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ sprintf (LABEL, "*%s%ld", PREFIX, (long) NUM)/* This is how to align the code that follows an unconditional branch. */#define LABEL_ALIGN_AFTER_BARRIER(LABEL) (2)/* This is how to output an element of a case-vector that is absolute. (The ns32k 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. *//* ** Notice that the second element is LI format! */#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf (FILE, "\t.long L%d-LI%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) \ fprintf (FILE, "\t.align %d\n", (LOG))#define ASM_OUTPUT_SKIP(FILE,SIZE) \ fprintf (FILE, "\t.space %u\n", (int)(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", (int)(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", (int)(ROUNDED)))/* Print an instruction operand X on file FILE. CODE is the code from the %-spec that requested printing this operand; if `%z3' was used to print operand 3, then CODE is 'z'. *//* %$ means print the prefix for an immediate operand. */#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ ((CODE) == '$' || (CODE) == '?')#define PRINT_OPERAND(FILE, X, CODE) print_operand(FILE, X, CODE)/* Print a memory operand whose address is X, on file FILE. */#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address(FILE, ADDR)extern const unsigned int ns32k_reg_class_contents[N_REG_CLASSES][1];extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; /* smallest class containing REGNO *//*Local variables:version-control: tEnd:*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -