📄 vax.h
字号:
/* This flag, if defined, says the same insns that convert to a signed fixnum also convert validly to an unsigned one. */#define FIXUNS_TRUNC_LIKE_FIX_TRUNC/* Max number of bytes we can move from memory to memory in one reasonably fast instruction. */#define MOVE_MAX 8/* 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/* This machine doesn't use IEEE floats. */#define TARGET_FLOAT_FORMAT VAX_FLOAT_FORMAT/* Specify the cost of a branch insn; roughly the number of extra insns that should be added to avoid a branch. Branches are extremely cheap on the VAX while the shift insns often used to replace branches can be expensive. */#define BRANCH_COST 0/* Tell final.c how to eliminate redundant test instructions. *//* Here we define machine-dependent flags and fields in cc_status (see `conditions.h'). No extra ones are needed for the VAX. *//* 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) \ vax_notice_update_cc ((EXP), (INSN))#define OUTPUT_JUMP(NORMAL, FLOAT, NO_OV) \ { if (cc_status.flags & CC_NO_OVERFLOW) \ return NO_OV; \ return NORMAL; \ }/* Control the assembler format that we output. *//* A C string constant describing how to begin a comment in the target assembler language. The compiler assumes that the comment will end at the end of the line. */#define ASM_COMMENT_START "#"/* 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 before read-only data. */#define TEXT_SECTION_ASM_OP "\t.text"/* Output before writable data. */#define DATA_SECTION_ASM_OP "\t.data"/* How to refer to registers in assembler output. This sequence is indexed by compiler's hard-register-number (see above). The register names will be prefixed by REGISTER_PREFIX, if any. */#define REGISTER_PREFIX ""#define REGISTER_NAMES \ { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ "r8", "r9", "r10", "r11", "ap", "fp", "sp", "pc", }/* This is BSD, so it wants DBX format. */#define DBX_DEBUGGING_INFO 1/* Do not break .stabs pseudos into continuations. */#define DBX_CONTIN_LENGTH 0/* This is the char to use for continuation (in case we need to turn continuation back on). */#define DBX_CONTIN_CHAR '?'/* Don't use the `xsfoo;' construct in DBX output; this system doesn't support it. */#define DBX_NO_XREFS/* Output the .stabs for a C `static' variable in the data section. */#define DBX_STATIC_STAB_DATA_SECTION/* VAX specific: which type character is used for type double? */#define ASM_DOUBLE_CHAR (TARGET_G_FLOAT ? 'g' : 'd')/* 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 "/* The prefix to add to user-visible assembler symbols. */#define USER_LABEL_PREFIX "_"/* 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 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, "\tpushl %s\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, "\tmovl (%s)+,%s\n", reg_names[STACK_POINTER_REGNUM], \ reg_names[REGNO])/* This is how to output an element of a case-vector that is absolute. (The VAX does not use such vectors, but we must define this macro anyway.) */#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ do \ { \ char label[256]; \ ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));\ fprintf (FILE, "\t.long "); \ assemble_name (FILE, label); \ fprintf (FILE, "\n"); \ } \ while (0)/* This is how to output an element of a case-vector that is relative. */#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ do \ { \ char label[256]; \ ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE)); \ fprintf (FILE, "\t.word "); \ assemble_name (FILE, label); \ ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL)); \ fprintf (FILE, "-"); \ assemble_name (FILE, label); \ fprintf (FILE, "\n"); \ } \ while (0)/* 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))/* This is how to output an assembler line that says to advance the location counter by SIZE bytes. */#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)))/* 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)))/* 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'.VAX operand formatting codes: letter print C reverse branch condition D 64-bit immediate operand B the low 8 bits of the complement of a constant operand H the low 16 bits of the complement of a constant operand M a mask for the N highest bits of a word N the complement of a constant integer operand P constant operand plus 1 R 32 - constant operand b the low 8 bits of a negated constant operand h the low 16 bits of a negated constant operand # 'd' or 'g' depending on whether dfloat or gfloat is used | register prefix *//* The purpose of D is to get around a quirk or bug in VAX assembler whereby -1 in a 64-bit immediate operand means 0x00000000ffffffff, which is not a 64-bit minus one. As a workaround, we output negative values in hex. */#if HOST_BITS_PER_WIDE_INT == 64# define NEG_HWI_PRINT_HEX16 HOST_WIDE_INT_PRINT_HEX#else# define NEG_HWI_PRINT_HEX16 "0xffffffff%08lx"#endif#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ ((CODE) == '#' || (CODE) == '|')#define PRINT_OPERAND(FILE, X, CODE) \{ if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE); \ else if (CODE == '|') \ fputs (REGISTER_PREFIX, FILE); \ else if (CODE == 'C') \ fputs (rev_cond_name (X), FILE); \ else if (CODE == 'D' && GET_CODE (X) == CONST_INT && INTVAL (X) < 0) \ fprintf (FILE, "$" NEG_HWI_PRINT_HEX16, INTVAL (X)); \ else if (CODE == 'P' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, INTVAL (X) + 1); \ else if (CODE == 'N' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, ~ INTVAL (X)); \ /* rotl instruction cannot deal with negative arguments. */ \ else if (CODE == 'R' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (X)); \ else if (CODE == 'H' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$%d", (int) (0xffff & ~ INTVAL (X))); \ else if (CODE == 'h' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$%d", (short) - INTVAL (x)); \ else if (CODE == 'B' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$%d", (int) (0xff & ~ INTVAL (X))); \ else if (CODE == 'b' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$%d", (int) (0xff & - INTVAL (X))); \ else if (CODE == 'M' && GET_CODE (X) == CONST_INT) \ fprintf (FILE, "$%d", ~((1 << INTVAL (x)) - 1)); \ else if (GET_CODE (X) == REG) \ fprintf (FILE, "%s", reg_names[REGNO (X)]); \ else if (GET_CODE (X) == MEM) \ output_address (XEXP (X, 0)); \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \ { char dstr[30]; \ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \ sizeof (dstr), 0, 1); \ fprintf (FILE, "$0f%s", dstr); } \ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode) \ { char dstr[30]; \ real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X), \ sizeof (dstr), 0, 1); \ fprintf (FILE, "$0%c%s", ASM_DOUBLE_CHAR, dstr); } \ else { putc ('$', FILE); output_addr_const (FILE, X); }}/* Print a memory operand whose address is X, on file FILE. This uses a function in output-vax.c. */#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ print_operand_address (FILE, ADDR)/* This is a blatent lie. However, it's good enough, since we don't actually have any code whatsoever for which this isn't overridden by the proper FDE definition. */#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PC_REGNUM)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -