📄 tm-vax.h
字号:
/* 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 *//* Shift counts can be negative. */#define NEGATIVE_SHIFT_COUNTS 1/* 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/* Compute the cost of computing a constant rtl expression RTX whose rtx-code is CODE. The body of this macro is a portion of a switch statement. If the code is computed here, return it with a return statement. Otherwise, break from the switch. */#define CONST_COSTS(RTX,CODE) \ case CONST_INT: \ /* Constant zero is super cheap due to clr instruction. */ \ if (RTX == const0_rtx) return 0; \ if ((unsigned) INTVAL (RTX) < 077) return 1; \ case CONST: \ case LABEL_REF: \ case SYMBOL_REF: \ return 3; \ case CONST_DOUBLE: \ return 5;/* * We can use the BSD C library routines for the gnulib calls that are * still generated, since that's what they boil down to anyways. */#define UDIVSI3_LIBCALL "*udiv"#define UMODSI3_LIBCALL "*urem"/* Check a `double' value for validity for a particular machine mode. *//* note that it is very hard to accidently create a number that fits in a double but not in a float, since their ranges are almost the same */#define CHECK_FLOAT_VALUE(mode, d) \ if ((mode) == SFmode) \ { \ if ((d) > 1.7014117331926444e+38) \ { error ("magnitude of constant too large for `float'"); \ (d) = 1.7014117331926444e+38; } \ else if ((d) < -1.7014117331926444e+38) \ { error ("magnitude of constant too large for `float'"); \ (d) = -1.7014117331926444e+38; } \ else if (((d) > 0) && ((d) < 2.9387358770557188e-39)) \ { warning ("`float' constant truncated to zero"); \ (d) = 0.0; } \ else if (((d) < 0) && ((d) > -2.9387358770557188e-39)) \ { warning ("`float' constant truncated to zero"); \ (d) = 0.0; } \ }/* For future reference: D Float: 9 bit, sign magnitude, excess 128 binary exponent normalized 56 bit fraction, redundant bit not represented approximately 16 decimal digits of precision The values to use if we trust decimal to binary conversions:#define MAX_D_FLOAT 1.7014118346046923e+38#define MIN_D_FLOAT .29387358770557188e-38 G float: 12 bit, sign magnitude, excess 1024 binary exponent normalized 53 bit fraction, redundant bit not represented approximately 15 decimal digits precision The values to use if we trust decimal to binary conversions:#define MAX_G_FLOAT .898846567431157e+308#define MIN_G_FLOAT .556268464626800e-308*//* 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) \{ if (GET_CODE (EXP) == SET) \ { if (GET_CODE (SET_SRC (EXP)) == CALL) \ CC_STATUS_INIT; \ else if (GET_CODE (SET_DEST (EXP)) != PC) \ { cc_status.flags = 0; \ cc_status.value1 = SET_DEST (EXP); \ cc_status.value2 = SET_SRC (EXP); } } \ else if (GET_CODE (EXP) == PARALLEL \ && GET_CODE (XVECEXP (EXP, 0, 0)) == SET \ && GET_CODE (SET_DEST (XVECEXP (EXP, 0, 0))) != PC) \ { cc_status.flags = 0; \ cc_status.value1 = SET_DEST (XVECEXP (EXP, 0, 0)); \ cc_status.value2 = SET_SRC (XVECEXP (EXP, 0, 0)); } \ /* PARALLELs whose first element sets the PC are aob, sob insns. \ They do change the cc's. So drop through and forget the cc's. */ \ else CC_STATUS_INIT; \ if (cc_status.value1 && GET_CODE (cc_status.value1) == REG \ && cc_status.value2 \ && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2)) \ cc_status.value2 = 0; \ if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM \ && cc_status.value2 \ && GET_CODE (cc_status.value2) == MEM) \ cc_status.value2 = 0; }/* Actual condition, one line up, should be that value2's address depends on value1, but that is too much of a pain. */#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. *//* Output at beginning of assembler file. */#define ASM_FILE_START(FILE) fprintf (FILE, "#NO_APP\n");/* 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 ".text"/* Output before writable data. */#define DATA_SECTION_ASM_OP ".data"/* How to refer to registers in assembler output. This sequence is indexed by compiler's hard-register-number (see above). */#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/* How to renumber registers for dbx and gdb. Vax needs no change in the numeration. */#define DBX_REGISTER_NUMBER(REGNO) (REGNO)/* 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 the definition of a user-level label named NAME, such as the label on a static function or variable NAME. */#define ASM_OUTPUT_LABEL(FILE,NAME) \ do { assemble_name (FILE, NAME); fputs (":\n", FILE); } while (0)/* This is how to output a command to make the user-level label named NAME defined for reference from other files. */#define ASM_GLOBALIZE_LABEL(FILE,NAME) \ do { fputs (".globl ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)/* This is how to output a reference to a user-level label named NAME. */#define ASM_OUTPUT_LABELREF(FILE,NAME) \ fprintf (FILE, "_%s", NAME)/* This is how to output an internal numbered label where PREFIX is the class of label and NUM is the number within the class. */#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ fprintf (FILE, "%s%d:\n", PREFIX, NUM)/* 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%d", PREFIX, NUM)/* This is how to output an assembler line defining a `double' constant. It is .dfloat or .gfloat, depending. */#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ fprintf (FILE, "\t.%cfloat 0%c%.20e\n", ASM_DOUBLE_CHAR, \ ASM_DOUBLE_CHAR, (VALUE))/* This is how to output an assembler line defining a `float' constant. */#define ASM_OUTPUT_FLOAT(FILE,VALUE) \ fprintf (FILE, "\t.float 0f%.20e\n", (VALUE))/* This is how to output an assembler line defining an `int' constant. */#define ASM_OUTPUT_INT(FILE,VALUE) \( fprintf (FILE, "\t.long "), \ output_addr_const (FILE, (VALUE)), \ fprintf (FILE, "\n"))/* Likewise for `char' and `short' constants. */#define ASM_OUTPUT_SHORT(FILE,VALUE) \( fprintf (FILE, "\t.word "), \ output_addr_const (FILE, (VALUE)), \ fprintf (FILE, "\n"))#define ASM_OUTPUT_CHAR(FILE,VALUE) \( fprintf (FILE, "\t.byte "), \ output_addr_const (FILE, (VALUE)), \ fprintf (FILE, "\n"))/* This is how to output an assembler line for a numeric constant byte. */#define ASM_OUTPUT_BYTE(FILE,VALUE) \ fprintf (FILE, "\t.byte 0x%x\n", (VALUE))/* 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 (sp)+,%s\n", 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) \ fprintf (FILE, "\t.long L%d\n", VALUE)/* This is how to output an element of a case-vector that is relative. */#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ fprintf (FILE, "\t.word L%d-L%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))/* 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", (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", (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), ",%d\n", (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)))/* Define the parentheses used to group arithmetic operations in assembler code. */#define ASM_OPEN_PAREN "("#define ASM_CLOSE_PAREN ")"/* Define results of standard character escape sequences. */#define TARGET_BELL 007#define TARGET_BS 010#define TARGET_TAB 011#define TARGET_NEWLINE 012#define TARGET_VT 013#define TARGET_FF 014#define TARGET_CR 015/* 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'. On the Vax, the only code used is `#', indicating that either `d' or `g' should be printed, depending on whether we're using dfloat or gfloat. */#define PRINT_OPERAND_PUNCT_VALID_P(CODE) \ ((CODE) == '#')#define PRINT_OPERAND(FILE, X, CODE) \{ if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE); \ 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) != DImode) \ { union { double d; int i[2]; } u; \ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ fprintf (FILE, "$0%c%.20e", ASM_DOUBLE_CHAR, u.d); } \ 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -