📄 i370.h
字号:
{ \ size_t i, limit = (LEN); \ int j; \ for (j = 0, i = 0; i < limit; j++, i++) \ { \ int c = (PTR)[i]; \ if (ISCNTRL (c) || c == '&') \ { \ if (j % MVS_ASCII_TEXT_LENGTH != 0 ) \ fprintf (FILE, "'\n"); \ j = -1; \ if (c == '&') c = MAP_CHARACTER (c); \ fprintf (FILE, "\tDC\tX'%X'\n", c ); \ } \ else \ { \ if (j % MVS_ASCII_TEXT_LENGTH == 0) \ fprintf (FILE, "\tDC\tC'"); \ if ( c == '\'' ) \ fprintf (FILE, "%c%c", c, c); \ else \ fprintf (FILE, "%c", c); \ if (j % MVS_ASCII_TEXT_LENGTH == MVS_ASCII_TEXT_LENGTH - 1) \ fprintf (FILE, "'\n" ); \ } \ } \ if (j % MVS_ASCII_TEXT_LENGTH != 0) \ fprintf (FILE, "'\n"); \}/* 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) \ if (LOG) \ { \ if ((LOG) == 1) \ fprintf (FILE, "\tDS\t0H\n" ); \ else \ fprintf (FILE, "\tDS\t0F\n" ); \ } \/* The maximum length of memory that the IBM assembler will allow in one DS operation. */#define MAX_CHUNK 32767/* A C statement to output to the stdio stream FILE an assembler instruction to advance the location counter by SIZE bytes. Those bytes should be zero when loaded. */#define ASM_OUTPUT_SKIP(FILE, SIZE) \{ \ int s, k; \ for (s = (SIZE); s > 0; s -= MAX_CHUNK) \ { \ if (s > MAX_CHUNK) \ k = MAX_CHUNK; \ else \ k = s; \ fprintf (FILE, "\tDS\tXL%d\n", k); \ } \}/* A C statement (sans semicolon) to output to the stdio stream FILE the assembler definition of a common-label named NAME whose size is SIZE bytes. The variable ROUNDED is the size rounded up to whatever alignment the caller wants. */#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \{ \ char temp[MAX_MVS_LABEL_SIZE + 1]; \ if (mvs_check_alias(NAME, temp) == 2) \ { \ fprintf (FILE, "%s\tALIAS\tC'%s'\n", temp, NAME); \ } \ fputs ("\tENTRY\t", FILE); \ assemble_name (FILE, NAME); \ fputs ("\n", FILE); \ fprintf (FILE, "\tDS\t0F\n"); \ ASM_OUTPUT_LABEL (FILE,NAME); \ ASM_OUTPUT_SKIP (FILE,SIZE); \}/* A C statement (sans semicolon) to output to the stdio stream FILE the assembler definition of a local-common-label named NAME whose size is SIZE bytes. The variable ROUNDED is the size rounded up to whatever alignment the caller wants. */#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \{ \ fprintf (FILE, "\tDS\t0F\n"); \ ASM_OUTPUT_LABEL (FILE,NAME); \ ASM_OUTPUT_SKIP (FILE,SIZE); \}/* 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 operand XV (an rtx) in assembler syntax to file FILE. CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified. For `%' followed by punctuation, CODE is the punctuation and XV is null. */#define PRINT_OPERAND(FILE, XV, CODE) \{ \ switch (GET_CODE (XV)) \ { \ static char curreg[4]; \ case REG: \ if (CODE == 'N') \ strcpy (curreg, reg_names[REGNO (XV) + 1]); \ else \ strcpy (curreg, reg_names[REGNO (XV)]); \ fprintf (FILE, "%s", curreg); \ break; \ case MEM: \ { \ rtx addr = XEXP (XV, 0); \ if (CODE == 'O') \ { \ if (GET_CODE (addr) == PLUS) \ fprintf (FILE, "%d", INTVAL (XEXP (addr, 1))); \ else \ fprintf (FILE, "0"); \ } \ else if (CODE == 'R') \ { \ if (GET_CODE (addr) == PLUS) \ fprintf (FILE, "%s", reg_names[REGNO (XEXP (addr, 0))]);\ else \ fprintf (FILE, "%s", reg_names[REGNO (addr)]); \ } \ else \ output_address (XEXP (XV, 0)); \ } \ break; \ case SYMBOL_REF: \ case LABEL_REF: \ mvs_page_lit += 4; \ if (SYMBOL_REF_FLAG (XV)) fprintf (FILE, "=V("); \ else fprintf (FILE, "=A("); \ output_addr_const (FILE, XV); \ fprintf (FILE, ")"); \ break; \ case CONST_INT: \ if (CODE == 'B') \ fprintf (FILE, "%d", INTVAL (XV) & 0xff); \ else if (CODE == 'X') \ fprintf (FILE, "%02X", INTVAL (XV) & 0xff); \ else if (CODE == 'h') \ fprintf (FILE, "%d", (INTVAL (XV) << 16) >> 16); \ else if (CODE == 'H') \ { \ mvs_page_lit += 2; \ fprintf (FILE, "=H'%d'", (INTVAL (XV) << 16) >> 16); \ } \ else if (CODE == 'K') \ { \ /* auto sign-extension of signed 16-bit to signed 32-bit */ \ mvs_page_lit += 4; \ fprintf (FILE, "=F'%d'", (INTVAL (XV) << 16) >> 16); \ } \ else if (CODE == 'W') \ { \ /* hand-built sign-extension of signed 32-bit to 64-bit */ \ mvs_page_lit += 8; \ if (0 <= INTVAL (XV)) { \ fprintf (FILE, "=XL8'00000000"); \ } else { \ fprintf (FILE, "=XL8'FFFFFFFF"); \ } \ fprintf (FILE, "%08X'", INTVAL (XV)); \ } \ else \ { \ mvs_page_lit += 4; \ fprintf (FILE, "=F'%d'", INTVAL (XV)); \ } \ break; \ case CONST_DOUBLE: \ if (GET_MODE (XV) == DImode) \ { \ if (CODE == 'M') \ { \ mvs_page_lit += 4; \ fprintf (FILE, "=XL4'%08X'", CONST_DOUBLE_LOW (XV)); \ } \ else if (CODE == 'L') \ { \ mvs_page_lit += 4; \ fprintf (FILE, "=XL4'%08X'", CONST_DOUBLE_HIGH (XV)); \ } \ else \ { \ mvs_page_lit += 8; \ fprintf (FILE, "=XL8'%08X%08X'", CONST_DOUBLE_LOW (XV), \ CONST_DOUBLE_HIGH (XV)); \ } \ } \ else \ { \ char buf[50]; \ if (GET_MODE (XV) == SFmode) \ { \ mvs_page_lit += 4; \ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (XV), \ sizeof (buf), 0, 1); \ fprintf (FILE, "=E'%s'", buf); \ } \ else if (GET_MODE (XV) == DFmode) \ { \ mvs_page_lit += 8; \ real_to_decimal (buf, CONST_DOUBLE_REAL_VALUE (XV), \ sizeof (buf), 0, 1); \ fprintf (FILE, "=D'%s'", buf); \ } \ else /* VOIDmode */ \ { \ mvs_page_lit += 8; \ fprintf (FILE, "=XL8'%08X%08X'", \ CONST_DOUBLE_HIGH (XV), CONST_DOUBLE_LOW (XV)); \ } \ } \ break; \ case CONST: \ if (GET_CODE (XEXP (XV, 0)) == PLUS \ && GET_CODE (XEXP (XEXP (XV, 0), 0)) == SYMBOL_REF) \ { \ mvs_page_lit += 4; \ if (SYMBOL_REF_FLAG (XEXP (XEXP (XV, 0), 0))) \ { \ fprintf (FILE, "=V("); \ ASM_OUTPUT_LABELREF (FILE, \ XSTR (XEXP (XEXP (XV, 0), 0), 0)); \ fprintf (FILE, ")\n\tA\t%s,=F'%d'", curreg, \ INTVAL (XEXP (XEXP (XV, 0), 1))); \ } \ else \ { \ fprintf (FILE, "=A("); \ output_addr_const (FILE, XV); \ fprintf (FILE, ")"); \ } \ } \ else \ { \ mvs_page_lit += 4; \ fprintf (FILE, "=F'"); \ output_addr_const (FILE, XV); \ fprintf (FILE, "'"); \ } \ break; \ default: \ abort(); \ } \}#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \{ \ rtx breg, xreg, offset, plus; \ \ switch (GET_CODE (ADDR)) \ { \ case REG: \ fprintf (FILE, "0(%s)", reg_names[REGNO (ADDR)]); \ break; \ case PLUS: \ breg = 0; \ xreg = 0; \ offset = 0; \ if (GET_CODE (XEXP (ADDR, 0)) == PLUS) \ { \ if (GET_CODE (XEXP (ADDR, 1)) == REG) \ breg = XEXP (ADDR, 1); \ else \ offset = XEXP (ADDR, 1); \ plus = XEXP (ADDR, 0); \ } \ else \ { \ if (GET_CODE (XEXP (ADDR, 0)) == REG) \ breg = XEXP (ADDR, 0); \ else \ offset = XEXP (ADDR, 0); \ plus = XEXP (ADDR, 1); \ } \ if (GET_CODE (plus) == PLUS) \ { \ if (GET_CODE (XEXP (plus, 0)) == REG) \ { \ if (breg) \ xreg = XEXP (plus, 0); \ else \ breg = XEXP (plus, 0); \ } \ else \ { \ offset = XEXP (plus, 0); \ } \ if (GET_CODE (XEXP (plus, 1)) == REG) \ { \ if (breg) \ xreg = XEXP (plus, 1); \ else \ breg = XEXP (plus, 1); \ } \ else \ { \ offset = XEXP (plus, 1); \ } \ } \ else if (GET_CODE (plus) == REG) \ { \ if (breg) \ xreg = plus; \ else \ breg = plus; \ } \ else \ { \ offset = plus; \ } \ if (offset) \ { \ if (GET_CODE (offset) == LABEL_REF) \ fprintf (FILE, "L%d", \ CODE_LABEL_NUMBER (XEXP (offset, 0))); \ else \ output_addr_const (FILE, offset); \ } \ else \ fprintf (FILE, "0"); \ if (xreg) \ fprintf (FILE, "(%s,%s)", \ reg_names[REGNO (xreg)], reg_names[REGNO (breg)]); \ else \ fprintf (FILE, "(%s)", reg_names[REGNO (breg)]); \ break; \ default: \ mvs_page_lit += 4; \ if (SYMBOL_REF_FLAG (ADDR)) fprintf (FILE, "=V("); \ else fprintf (FILE, "=A("); \ output_addr_const (FILE, ADDR); \ fprintf (FILE, ")"); \ break; \ } \}#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \{ \ if (strlen (NAME) + 1 > mvs_function_name_length) \ { \ if (mvs_function_name) \ free (mvs_function_name); \ mvs_function_name = 0; \ } \ if (!mvs_function_name) \ { \ mvs_function_name_length = strlen (NAME) * 2 + 1; \ mvs_function_name = (char *) xmalloc (mvs_function_name_length); \ } \ if (!strcmp (NAME, "main")) \ strcpy (mvs_function_name, "gccmain"); \ else \ strcpy (mvs_function_name, NAME); \ fprintf (FILE, "\tDS\t0F\n"); \ assemble_name (FILE, mvs_function_name); \ fputs ("\tRMODE\tANY\n", FILE); \ assemble_name (FILE, mvs_function_name); \ fputs ("\tCSECT\n", FILE); \}/* Output assembler code to FILE to increment profiler label # LABELNO for profiling a function entry. */#define FUNCTION_PROFILER(FILE, LABELNO) \ fprintf (FILE, "Error: No profiling available.\n")#endif /* TARGET_HLASM *//* ======================================================== */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -